diff --git a/components/boards/pca10056.h b/components/boards/pca10056.h index bdd0166..03b9b52 100644 --- a/components/boards/pca10056.h +++ b/components/boards/pca10056.h @@ -47,16 +47,16 @@ extern "C" { #include "nrf_gpio.h" // LEDs definitions for PCA10056 -#define LEDS_NUMBER 1 +#define LEDS_NUMBER 2 -#define LED_1 NRF_GPIO_PIN_MAP(0,12) //Green LED for Advertise -#define LED_START LED_1 -#define LED_STOP LED_1 +#define LED_GR NRF_GPIO_PIN_MAP(0,12) //Green LED for Advertise +#define LED_YL_TEST NRF_GPIO_PIN_MAP(0,29) // Yello LED for Function 260311 #define LEDS_ACTIVE_STATE 0 -#define LEDS_LIST { LED_1 } +#define LEDS_LIST { LED_GR, LED_YL_TEST } #define LEDS_INV_MASK LEDS_MASK -#define BSP_LED_0 LED_1 +#define BSP_LED_0 LED_GR +#define BSP_LED_1 LED_YL_TEST // 260311 #define BUTTONS_NUMBER 3 diff --git a/data/260311 VesiScan-Basic_VB0HW0100_Firmware Dev 버전 개발 사양.md b/data/260311 VesiScan-Basic_VB0HW0100_Firmware Dev 버전 개발 사양.md new file mode 100644 index 0000000..0a372bf --- /dev/null +++ b/data/260311 VesiScan-Basic_VB0HW0100_Firmware Dev 버전 개발 사양.md @@ -0,0 +1,342 @@ +# VB0HW0100 — Firmware Dev. 버전 개발 사양서 + +## 1. 시스템 개요 + +### 1-1. 보드 기능 + +초음파 방광 모니터링을 위한 웨어러블 디바이스. +6채널 Piezo 트랜스듀서를 순차 구동하여 A-mode 초음파 측정을 수행하고, BLE를 통해 데이터를 전송한다. +Dev. 버전은 모든 명령이 앱에서 내려지도록 개발. + +### 1-2. 기능 블록 구분 + +| 블록 | 명칭 | 주요 IC | 역할 | +|------|------|---------|------| +| 제어부 | Control | nRF52840 (U26) | MCU, BLE, 전체 제어 | +| | | W25Q32 (U16) | Flash Memory (데이터 저장) | +| | | ICM-42670 (U10) | IMU 센서 (6축) | +| TX | Transmit | MD1822 (U27) | MOSFET Driver | +| | | TC7920 (U30) | MOSFET (고전압 스위칭) | +| | | MAX14778 (U31) | 8채널 MUX (채널 선택) | +| | | Misc | TMP235 (U22) | 온도 센서 | +| RX | Receive | MD0100 (U34) | T/R 스위치 (수신 보호) | +| | | OPA2836 (U2) | 2단 수신 증폭기 | +| | | ADL5513 (U23) | 로그 디텍터 (AGC) | +| | | ADC121S051 (U37) | 12비트 SPI ADC | +| 전원 | Power | MIC5528 (U5) | LDO → +3.3V_M (제어부) | +| | | MIC5528 (U42) | LDO → +3.3V_PZT_TX (TX) | +| | | MIC5528 (U41) | LDO → +3.3V_PZT_RX (RX) | +| | | LT3463 (U32) | DC-DC → ±25V (펄서 전원) | +| | | MCP1804 (U33) | LDO → +10V | +| | | LM27762 (U38) | Charge Pump → ±2.75V (Op-Amp 전원) | +| | | MCP73838 (U3) | 배터리 충전 IC | + +### 1-3. 신호 흐름 + +``` +[TX 경로] +nRF52840 → MD1822 (Driver) → TC7920 (MOSFET) → MAX14778 (MUX) → Piezo (6ch 중 1개) + +[RX 경로] +Piezo (6ch 중 1개) → MAX14778 (MUX) → MD0100 (T/R 보호) → OPA2836 (2단 증폭) → ADL5513 (로그 디텍터) → ADC121S051 → nRF52840 +``` + +--- + +## 2. 전원 시퀀싱 + +### 2-1. 전원 도메인 + +| 도메인 | 전원넷 | LDO | Enable 신호 | 공급 대상 | +|--------|--------|-----|-------------|-----------| +| 제어부 | +3.3V_M | U5 (MIC5528) | PWR_MCU_EN | nRF52840, W25Q32, ICM-42670 | +| TX | +3.3V_PZT_TX | U42 (MIC5528) | PZT_PWR_EN | 펄서 관련 회로 (MD1822, TC7920 등) | +| RX | +3.3V_PZT_RX | U41 (MIC5528) | PZT_PWR_EN | 수신 회로 (OPA2836, ADC121S051 등) | + +- TX와 RX는 **동일한 PZT_PWR_EN** 신호로 동시에 ON/OFF + +### 2-2. 전원 켜기 (Power ON) + +1. 사용자가 **SW2**를 누름 +2. PWR_MCU_EN = **High** → U5 활성화 → +3.3V_M 출력 +3. nRF52840 부팅 시작 +4. MCU가 SW2 눌림 상태를 확인하며 **2초간** 유지 여부 판단 +5. 조건 충족 시 MCU가 **PWR_HOLD = High** 출력 → 자기유지 (Self-Latch) +6. 이후 SW2를 놓아도 전원 유지됨 + +### 2-3. 전원 끄기 (Power OFF) + +1. MCU는 **BUTTON_CHECK** 핀으로 SW2 상태를 상시 감시 +2. SW2가 **3초간** 눌림 유지 감지 +3. MCU가 **PWR_HOLD = Low** 출력 +4. U5 이네이블 해제 → +3.3V_M 차단 → 전체 전원 OFF + +### 2-4. 동작 모드 + +| 모드 | 제어부 (+3.3V_M) | TX (+3.3V_PZT_TX) | RX (+3.3V_PZT_RX) | 설명 | +|------|:-:|:-:|:-:|------| +| **Sleep Mode** | ON | OFF | OFF | 모든 IC 저전력 모드 동작, MCU BLE 유지, 명령 대기 | +| **Active Mode** | ON | ON | ON | 초음파 측정 가능 상태 | + +- Sleep → Active: MCU가 **PZT_PWR_EN = High** +- Active → Sleep: MCU가 **PZT_PWR_EN = Low** +- 기본 상태는 항상 **Sleep Mode** +- W25Q32와 ICM-42670는 초기설정을 **Deep Power-Down** 모드로 세팅 +- 모든 측정 후에는 항상 **Sleep Mode**로 복귀 +--- + +## 3. 측정 명령 + +### 3-1. 측정 명령 종류 + +| 측정 명령 | 측정 대상 | 필요 모드 | 비고 | +|-----------|-----------|:-:|------| +| 배터리 전압 측정 | ADC_BAT | Sleep | +3.3V_M 도메인, Active 전환 불필요 | +| IMU 측정 | ICM-42670 (I2C) | Sleep | +3.3V_M 도메인, Active 전환 불필요 | +| 온도 측정 | TMP235 (ADC_TEMP) | **Active** | TX/RX 전원 필요 | +| 초음파 측정 | Piezo 6ch | **Active** | TX/RX 전원 필요 | +| 모두 측정 | 전체 | **Active** | TX/RX 전원 필요 | + +- + +### 3-2. 명령별 동작 흐름 + +**Sleep Mode에서 처리 (Active 전환 불필요)** + +``` +배터리 측정 명령 → 동작모드 전환 → ADC_BAT 읽기 → BLE 전송 → Deep Power-Down 모드 전환 +IMU 측정 명령 → 동작모드 전환 → I2C로 ICM-42670 읽기 → BLE 전송 → Deep Power-Down 모드 또는 필요 모드 전환 +``` + +**Active Mode 필요** + +``` +온도 측정 명령 → Active 진입 → ADC_TEMP 읽기 → BLE 전송 → Sleep 복귀 +초음파 측정 명령 → Active 진입 → 6ch 스캔 → BLE 전송 → Sleep 복귀 +모두 측정 명령 → Active 진입 → 배터리 + IMU + 온도 + 초음파 → BLE 전송 → Sleep 복귀 +``` + +--- + +## 4. Piezo 초음파 측정 + +### 4-1. 측정 파라미터 + +| 파라미터 | 범위 | 설명 | +|----------|------|------| +| Frequency | 1.8 / 1.9 / 2.0 / 2.1 / 2.2 MHz | 송신 펄스 주파수 | +| Cycle | 3 ~ 7 | 송신 펄스 사이클 수 | +| 평균화 수 (Avg) | 1 ~ 10 | 채널당 반복 측정 횟수 | +| 측정 Channel 개수 (N) | 1 ~ 6 | 측정 대상 채널 수 | +| 대기 시간 (Delay) | 0~30 (default: 10) | TX 펄수 출력 후 ADC 시작 시까지 대기 시간 (μs) | +| 측정 샘플 수 (Num_samples) | 80 ~ 140 | 측정 ADC 샘플 개수 | + +### 4-2. 채널 정의 + +- 총 **6채널**: CH0, CH1, CH2, CH3, CH4, CH5 +- Channel 개수 = N이면 **CH0 ~ CH(N-1)** 을 순차 측정 +- 예: N=4 → CH0, CH1, CH2, CH3만 측정 + +### 4-3. 평균화 동작 + +각 채널별로 평균화 수(Avg)만큼 반복 측정한 후, 평균값을 해당 채널의 최종 측정값으로 사용한다. + +예: Avg=5, N=3인 경우 + +``` +CH0: 측정①②③④⑤ → 평균 → CH0 최종값 +CH1: 측정①②③④⑤ → 평균 → CH1 최종값 +CH2: 측정①②③④⑤ → 평균 → CH2 최종값 +``` + +### 4-4. TX 송신 절차 + +1. **MAX14778 (MUX)** 채널 선택 (해당 Piezo 연결) +2. **1.3ms 대기** (MAX14778 채널 스위칭 안정화 시간) +3. **PZT_PE = High** (펄서 활성화) +4. **MD1822**에 설정된 Frequency / Cycle로 펄스 신호 입력 +5. **TC7920 (MOSFET)** 이 ±25V 펄스를 Piezo에 인가 + +| 관련 핀/넷 | 연결 | +|------------|------| +| PZT_CH_SEL0 | U26.A20 → U31 (MUX 채널 선택 비트 0) | +| PZT_CH_SEL1 | U26.B11 → U31 (MUX 채널 선택 비트 1) | +| PZT_EN_MUXA | U26.AC17 → U31 (MUX A 활성화) | +| PZT_EN_MUXB | U26.AC19 → U31 (MUX B 활성화) | +| PZT_PE | U26.AC21 → U27.15 (펄서 이네이블) | +| PZT_P_PULSE | U26.P23 → R30 (48.7Ω) → U27 (양의 펄스) | +| PZT_N_PULSE | U26.R24 → R40 (48.7Ω) → U27 (음의 펄스) | +| PZT_DMP | U26.AD22 → R12 (48.7Ω) → U27 (댐핑 제어) | + +### 4-5. RX 수신 절차 + +1. TX 펄스 출력 후 약 **10μs 대기** (근거리 잔향 회피) +2. 에코 신호 경로: + Piezo → MAX14778 (MUX) → MD0100 (T/R 보호) → OPA2836 (2단 증폭, 총 ~40dB) → ADL5513 (로그 디텍터) +3. **ADC121S051**에서 약 **300μs 동안** ADC 값 연속 수집 +4. MCU가 SPI를 통해 ADC 데이터 읽기 + +| 관련 핀/넷 | 연결 | +|------------|------| +| \PZT_SPI_CS | U26.AC15 → U37 (ADC 칩셀렉트) | +| SPI_SCK | U26.AC9 (Flash와 공유) | +| SPI_MISO | U26.AD10 (Flash와 공유) | + +### 4-6. 단일 측정 타이밍 + +``` +|←── TX ──→|← 10μs →|←─────── 300μs RX 수집 ───────→| + 펄스 출력 대기 ADC121S051 연속 샘플링 +``` + +### 4-7. 전체 스캔 시퀀스 (예: Avg=5, N=3) + +``` +측정 명령 수신 +│ +▼ +Active Mode 진입 (PZT_PWR_EN = High) +│ +├─ CH0 선택 (MUX → A0) → 1.3ms 대기 +│ ├─ 1회: TX → 10μs → 300μs RX +│ ├─ 2회: TX → 10μs → 300μs RX +│ ├─ 3회: TX → 10μs → 300μs RX +│ ├─ 4회: TX → 10μs → 300μs RX +│ └─ 5회: TX → 10μs → 300μs RX +│ → CH0 평균값 산출 +│ +├─ CH1 선택 (MUX → A1) → 1.3ms 대기 +│ └─ 5회 반복 → CH1 평균값 산출 +│ +├─ CH2 선택 (MUX → A2) → 1.3ms 대기 +│ └─ 5회 반복 → CH2 평균값 산출 +│ +▼ +BLE 전송 +│ +▼ +Sleep Mode 복귀 (PZT_PWR_EN = Low) +``` + +--- + +## 5. 참고 사항 + +### 5-1. 배터리 전압 측정 + +- R28 (806kΩ) / R29 (2MΩ) 분압 → ADC_BAT +- 분압비: 2M / (806k + 2M) ≈ 0.713 +- nRF52840 내장 ADC로 읽기 + +### 5-2. 충전 / 동작 상태 표시 LED + +| LED | 색상 | 연결 네트 | 상태 | 표시 | +|-----|------|------|------|------| +| LED1 | 오렌지 | U3.STAT1 | 충전중 | 상시 점등 | +| LED2 | 블루 | U3.STAT2 | 충전 완료 | 상시 점등 | +| LED3 | 초록 | LED_BLE | BLE Advertising | 1초 간격 점멸 | +| LED3 | 초록 | LED_BLE | BLE 연결 후, Piezo 초음파 측정 후 복부 부착으로 감지된 경우 | 소등 | +| LED3 | 초록 | LED_BLE | Piezo 초음파 측정 후 탈착으로 감지된 경우 | 점등 1초 소등 3초 반복 | +| LED4 | 오렌지 | FUNCTION_LED | 기기 정렬모드에서 방광위치를 탐지하지 못하고 있을 경우 | 1초 간격 점멸 | +| LED3 | 초록 | LED_BLE | 기기 정렬모드에서 방광위치를 탐지하고 있을 경우 | 점등 3초 소등 1초 반복 | + +- 기기 정렬 모드 : 빠른 주기로 초음파 측정 +- 복부 부착, 탈착, 방광위치 탐지 유무는 앱에서 판단, LED 동작 모드 명령 송신 + +### 5-3. 펄서 고전압 전원 + +| 전원 | 생성 IC | 전압 | 용도 | +|------|---------|------|------| +| PZT_+25V | LT3463 (U32) | +25V | 양의 펄스 전압 | +| PZT_-25V | LT3463 (U32) | -25V | 음의 펄스 전압 | +| PZT_+10V | MCP1804 (U33) | +10V | MD1822 공급 전원 | + +### 5-4. 수신부 아날로그 전원 + +| 전원 | 생성 IC | 전압 | 용도 | +|------|---------|------|------| +| +2.75V_CP | LM27762 (U38) | +2.75V | OPA2836 양전원 | +| -2.75V_CP | LM27762 (U38) | -2.75V | OPA2836 음전원 | + +### 5-5. DFU 관련 주의사항 + +- nRF52840 DFU(Device Firmware Update) 부트로더에서 **P0.25를 사용하지 않도록** 수정 필요 +- 기본 DFU 부트로더가 P0.25를 버튼 입력 등으로 사용할 수 있으므로, 커스텀 DFU 빌드 시 해당 핀 설정을 제거 또는 변경할 것 + +### 5-6. MAX14778 채널 스위칭 지연 + +- MAX14778 채널 전환 후 신호 경로가 안정되기까지 **1.3ms delay** 필요 +- MUX_SelectChannel() 호출 후 반드시 1.3ms 대기 후 TX 펄스를 출력할 것 +- 동일 채널 내 반복 측정 시에는 추가 delay 불필요 (채널 전환 시에만 적용) + +--- + +## 6. 전력 절감 방안 + +### 6-1. Sleep Mode 소비 전류 줄이기 + +Sleep Mode에서 +3.3V_M에 상시 전원을 받는 IC는 3개이며, 각각에 대해 저전력 제어가 가능하다. + +**nRF52840 (MCU)** + +- BLE 연결 유지를 위해 System ON 슬립 상태를 사용 +- 사용하지 않는 peripheral 클럭을 모두 비활성화 +- RAM 리텐션 영역을 최소한으로 설정 +- 위 조치를 통해 수 μA 수준까지 소비 전류 절감 가능 + +**W25Q32 (Flash Memory)** + +- 대기 상태에서도 수 μA 소모 +- 측정/저장 시에만 깨우고, 평소에는 **Deep Power-Down** 모드 사용 +- Deep Power-Down 진입: SPI로 0xB9 커맨드 전송 → 소비 전류 약 1μA 이하 +- 복귀: 0xAB 커맨드 전송 후 수 μs 대기 +- \SPI_CS_FLASH를 High로 유지하는 것만으로는 불충분하며, 명시적으로 커맨드를 전송해야 함 + +| 상태 | 소비 전류 (대략) | 진입 방법 | +|------|:-:|------| +| Normal Standby | ~수 μA | 기본 상태 | +| Deep Power-Down | ~1μA 이하 | SPI 커맨드 0xB9 | + +**ICM-42670 (IMU Sensor)** + +- IMU를 상시 켜둘 필요 없음 +- 측정 명령이 올 때만 Wake → 측정 → 다시 Sleep 시키는 방식 사용 +- I2C로 슬립 모드 진입 또는 ODR(Output Data Rate)을 최소로 설정 + +| 상태 | 소비 전류 (대략) | 비고 | +|------|:-:|------| +| Full Rate 동작 | ~수백 μA | 가속도 + 자이로 활성 | +| Low Power / Sleep | ~수 μA 이하 | 측정 시에만 Wake | + +### 6-2. Active Mode 체류 시간 최소화 + +Active Mode에서는 TX/RX LDO(U42, U41)뿐 아니라 LT3463(±25V), MCP1804(+10V), LM27762(±2.75V) 등 고전압/아날로그 전원이 모두 켜지므로 소비 전류가 크게 증가한다. 따라서 Active Mode 체류 시간을 최소화하는 것이 전력 절감에 가장 효과적이다. + +**원칙: 측정 직전에 Active 진입, 측정 직후 즉시 Sleep 복귀** + +**전원 안정화 시간 관리** + +- PZT_PWR_EN = High 후 LDO/DC-DC 출력이 안정될 때까지 대기 필요 +- 이 안정화 시간을 실측하여 필요 최소한으로 설정 +- 불필요하게 긴 마진을 두지 않도록 주의 + +**스캔 시간 분석** + +| 항목 | 시간 | +|------|------| +| MUX 채널 스위칭 안정화 | 1.3ms (채널 전환 시 1회) | +| 1회 측정 (TX + 10μs 대기 + 300μs RX) | ~310μs | +| 1채널 (Avg=5) | 1.3ms + 5 × 310μs ≈ 2.85ms | +| 6채널 전체 (Avg=5, N=6) | 6 × 2.85ms ≈ 17.1ms | + +- 6채널 전체 스캔 자체는 약 17ms 이내로 완료 가능 +- 전원 안정화 대기 시간이 오히려 더 큰 비중을 차지할 수 있음 +- 채널 전환 → TX → RX를 타이트하게 구성하여 불필요한 간격 제거 + +**측정 파라미터에 의한 시간 절감** + +| 파라미터 조절 | 효과 | +|--------------|------| +| Channel 개수 줄이기 | 측정 채널 수에 비례하여 Active 시간 단축 | +| 평균화 수 줄이기 | 반복 횟수에 비례하여 Active 시간 단축 | +| 간헐 측정 (측정 주기 늘리기) | Active 진입 빈도 자체를 줄임 | diff --git a/data/CODE_REVIEW.pdf b/data/CODE_REVIEW.pdf new file mode 100644 index 0000000..6775cd9 --- /dev/null +++ b/data/CODE_REVIEW.pdf @@ -0,0 +1,37662 @@ +%PDF-1.4 +% +1 0 obj +<< +/CreationDate (D:20260315144824+00'00') +/Creator (Mozilla/5.0 \(Windows NT 10.0; Win64; x64\) AppleWebKit/537.36 \(KHTML, like Gecko\) HeadlessChrome/146.0.0.0 Safari/537.36) +/ModDate (D:20260315235841+09'00') +/Producer (Skia/PDF m146) +/Title (VesiScan-Basic Code Review) +>> +endobj +2 0 obj +<< +/Lang (ko-KR) +/MarkInfo << +/Marked true +/Type /MarkInfo +>> +/Metadata 3 0 R +/Pages 4 0 R +/StructTreeRoot 5 0 R +/Type /Catalog +/ViewerPreferences << +/DisplayDocTitle true +/Type /ViewerPreferences +>> +>> +endobj +3 0 obj +<< +/Length 3179 +/Subtype /XML +/Type /Metadata +>> +stream + + + + + 2026-03-15T23:48:24+09:00 + Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/146.0.0.0 Safari/537.36 + 2026-03-15T23:58:41+09:00 + Skia/PDF m146 + + + VesiScan-Basic Code Review + + + application/pdf + uuid:4492ca9f-5c53-4179-9f6e-262fe3986128 + uuid:96cf39a2-e447-49b5-a795-404e6b67e4df + + + + + + + + + + + + + + + + + + + + + + + + + +endstream +endobj +4 0 obj +<< +/Count 13 +/Kids [6 0 R 7 0 R] +/Type /Pages +>> +endobj +5 0 obj +<< +/IDTree 8 0 R +/K 9 0 R +/ParentTree 10 0 R +/ParentTreeNextKey 13 +/Type /StructTreeRoot +>> +endobj +6 0 obj +<< +/Count 8 +/Kids [11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R] +/Parent 4 0 R +/Type /Pages +>> +endobj +7 0 obj +<< +/Count 5 +/Kids [19 0 R 20 0 R 21 0 R 22 0 R 23 0 R] +/Parent 4 0 R +/Type /Pages +>> +endobj +8 0 obj +<< +/Kids [24 0 R] +>> +endobj +9 0 obj +<< +/K [25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R +41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R +57 0 R 58 0 R 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 72 0 R +73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R +89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R +105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R +121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R +137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R +153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R +169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R +185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R +201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R] +/Lang (ko-KR) +/P 5 0 R +/S /Document +/Type /StructElem +>> +endobj +10 0 obj +<< +/Nums [0 208 0 R 1 209 0 R 2 210 0 R 3 211 0 R 4 212 0 R 5 213 0 R 6 214 0 R 7 215 0 R +8 216 0 R 9 217 0 R 10 218 0 R 11 219 0 R 12 220 0 R] +/Type /ParentTree +>> +endobj +11 0 obj +<< +/Annots [221 0 R 222 0 R] +/Contents 223 0 R +/MediaBox [0 0 612 792] +/Parent 6 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F6 227 0 R +/F7 228 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 0 +/Tabs /S +/Type /Page +>> +endobj +12 0 obj +<< +/Contents 229 0 R +/MediaBox [0 0 612 792] +/Parent 6 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F7 228 0 R +/F10 230 0 R +/F11 231 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 1 +/Tabs /S +/Type /Page +>> +endobj +13 0 obj +<< +/Contents 232 0 R +/MediaBox [0 0 612 792] +/Parent 6 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F6 227 0 R +/F7 228 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 2 +/Tabs /S +/Type /Page +>> +endobj +14 0 obj +<< +/Contents 233 0 R +/MediaBox [0 0 612 792] +/Parent 6 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F7 228 0 R +/F10 230 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 3 +/Tabs /S +/Type /Page +>> +endobj +15 0 obj +<< +/Contents 234 0 R +/MediaBox [0 0 612 792] +/Parent 6 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F7 228 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 4 +/Tabs /S +/Type /Page +>> +endobj +16 0 obj +<< +/Contents 235 0 R +/MediaBox [0 0 612 792] +/Parent 6 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F7 228 0 R +/F10 230 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 5 +/Tabs /S +/Type /Page +>> +endobj +17 0 obj +<< +/Contents 236 0 R +/MediaBox [0 0 612 792] +/Parent 6 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F7 228 0 R +/F11 231 0 R +/F22 237 0 R +/F23 238 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 6 +/Tabs /S +/Type /Page +>> +endobj +18 0 obj +<< +/Contents 239 0 R +/MediaBox [0 0 612 792] +/Parent 6 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F7 228 0 R +/F10 230 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 7 +/Tabs /S +/Type /Page +>> +endobj +19 0 obj +<< +/Contents 240 0 R +/MediaBox [0 0 612 792] +/Parent 7 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F6 227 0 R +/F7 228 0 R +/F10 230 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 8 +/Tabs /S +/Type /Page +>> +endobj +20 0 obj +<< +/Contents 241 0 R +/MediaBox [0 0 612 792] +/Parent 7 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F7 228 0 R +/F10 230 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 9 +/Tabs /S +/Type /Page +>> +endobj +21 0 obj +<< +/Contents 242 0 R +/MediaBox [0 0 612 792] +/Parent 7 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F7 228 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 10 +/Tabs /S +/Type /Page +>> +endobj +22 0 obj +<< +/Contents 243 0 R +/MediaBox [0 0 612 792] +/Parent 7 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F5 226 0 R +/F7 228 0 R +/F10 230 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 11 +/Tabs /S +/Type /Page +>> +endobj +23 0 obj +<< +/Contents 244 0 R +/MediaBox [0 0 612 792] +/Parent 7 0 R +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Font << +/F4 225 0 R +/F7 228 0 R +/F10 230 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/StructParents 12 +/Tabs /S +/Type /Page +>> +endobj +24 0 obj +<< +/Limits [(node00001886) (node00003590)] +/Names [(node00001886) 245 0 R (node00001887) 246 0 R (node00001888) 247 0 R (node00001889) 248 0 R (node00001890) 249 0 R (node00001944) 250 0 R (node00001945) 251 0 R (node00001946) 252 0 R +(node00001947) 253 0 R (node00002266) 254 0 R (node00002267) 255 0 R (node00002268) 256 0 R (node00002269) 257 0 R (node00002359) 258 0 R (node00002360) 259 0 R (node00002361) 260 0 R +(node00002435) 261 0 R (node00002436) 262 0 R (node00002437) 263 0 R (node00002458) 264 0 R (node00002459) 265 0 R (node00002460) 266 0 R (node00002504) 267 0 R (node00002505) 268 0 R +(node00002506) 269 0 R (node00002507) 270 0 R (node00002548) 271 0 R (node00002549) 272 0 R (node00002550) 273 0 R (node00002551) 274 0 R (node00002641) 275 0 R (node00002642) 276 0 R +(node00002643) 277 0 R (node00002673) 278 0 R (node00002674) 279 0 R (node00002675) 280 0 R (node00003027) 281 0 R (node00003028) 282 0 R (node00003029) 283 0 R (node00003171) 284 0 R +(node00003172) 285 0 R (node00003173) 286 0 R (node00003174) 287 0 R (node00003385) 288 0 R (node00003386) 289 0 R (node00003387) 290 0 R (node00003465) 291 0 R (node00003466) 292 0 R +(node00003467) 293 0 R (node00003491) 294 0 R (node00003492) 295 0 R (node00003493) 296 0 R (node00003494) 297 0 R (node00003521) 298 0 R (node00003522) 299 0 R (node00003523) 300 0 R +(node00003557) 301 0 R (node00003558) 302 0 R (node00003559) 303 0 R (node00003589) 304 0 R (node00003590) 305 0 R] +>> +endobj +25 0 obj +<< +/K [306 0 R 0] +/P 9 0 R +/Pg 11 0 R +/S /H1 +/Type /StructElem +>> +endobj +26 0 obj +<< +/K [307 0 R 1] +/P 9 0 R +/Pg 11 0 R +/S /BlockQuote +/Type /StructElem +>> +endobj +27 0 obj +<< +/K 2 +/P 9 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +28 0 obj +<< +/K [308 0 R 3] +/P 9 0 R +/Pg 11 0 R +/S /H2 +/Type /StructElem +>> +endobj +29 0 obj +<< +/K [309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R] +/P 9 0 R +/S /L +/Type /StructElem +>> +endobj +30 0 obj +<< +/K 4 +/P 9 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +31 0 obj +<< +/K [317 0 R 5] +/P 9 0 R +/Pg 11 0 R +/S /H2 +/Type /StructElem +>> +endobj +32 0 obj +<< +/K 318 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +33 0 obj +<< +/K [319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R +335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +34 0 obj +<< +/K 342 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +35 0 obj +<< +/K [343 0 R 344 0 R 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 14] +/P 9 0 R +/Pg 11 0 R +/S /Table +/Type /StructElem +>> +endobj +36 0 obj +<< +/K 350 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +37 0 obj +<< +/K [351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 22 << +/MCID 6 +/Pg 12 0 R +/Type /MCR +>>] +/P 9 0 R +/Pg 11 0 R +/S /Table +/Type /StructElem +>> +endobj +38 0 obj +<< +/K 362 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +39 0 obj +<< +/K [363 0 R 364 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +40 0 obj +<< +/K [365 0 R 7] +/P 9 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +41 0 obj +<< +/K [366 0 R 367 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +42 0 obj +<< +/K [368 0 R 8] +/P 9 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +43 0 obj +<< +/K [369 0 R 370 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +44 0 obj +<< +/K [371 0 R 9] +/P 9 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +45 0 obj +<< +/K [372 0 R 373 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +46 0 obj +<< +/K [374 0 R 10] +/P 9 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +47 0 obj +<< +/K 11 +/P 9 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +48 0 obj +<< +/K [375 0 R 12] +/P 9 0 R +/Pg 12 0 R +/S /H2 +/Type /StructElem +>> +endobj +49 0 obj +<< +/K [376 0 R 377 0 R] +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +50 0 obj +<< +/K [378 0 R 379 0 R 380 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +51 0 obj +<< +/K 381 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +52 0 obj +<< +/K [382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 18 << +/MCID 7 +/Pg 13 0 R +/Type /MCR +>>] +/P 9 0 R +/Pg 12 0 R +/S /Table +/Type /StructElem +>> +endobj +53 0 obj +<< +/K 391 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +54 0 obj +<< +/K [392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R] +/P 9 0 R +/S /L +/Type /StructElem +>> +endobj +55 0 obj +<< +/K 398 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +56 0 obj +<< +/K 399 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +57 0 obj +<< +/K [400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 16] +/P 9 0 R +/Pg 13 0 R +/S /Table +/Type /StructElem +>> +endobj +58 0 obj +<< +/K [412 0 R 17] +/P 9 0 R +/Pg 13 0 R +/S /BlockQuote +/Type /StructElem +>> +endobj +59 0 obj +<< +/K 413 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +60 0 obj +<< +/K [414 0 R 415 0 R 416 0 R 21 << +/MCID 4 +/Pg 14 0 R +/Type /MCR +>>] +/P 9 0 R +/Pg 13 0 R +/S /Table +/Type /StructElem +>> +endobj +61 0 obj +<< +/K 5 +/P 9 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +62 0 obj +<< +/K [417 0 R 6] +/P 9 0 R +/Pg 14 0 R +/S /H2 +/Type /StructElem +>> +endobj +63 0 obj +<< +/K 418 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +64 0 obj +<< +/K 419 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +65 0 obj +<< +/K 420 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +66 0 obj +<< +/K [421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 13] +/P 9 0 R +/Pg 14 0 R +/S /Table +/Type /StructElem +>> +endobj +67 0 obj +<< +/K 428 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +68 0 obj +<< +/K [429 0 R 430 0 R 431 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +69 0 obj +<< +/K [432 0 R 433 0 R 434 0 R 435 0 R 19] +/P 9 0 R +/Pg 14 0 R +/S /Table +/Type /StructElem +>> +endobj +70 0 obj +<< +/K [436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +71 0 obj +<< +/K [446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +72 0 obj +<< +/K 460 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +73 0 obj +<< +/K [461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 28 << +/MCID 6 +/Pg 15 0 R +/Type /MCR +>>] +/P 9 0 R +/Pg 14 0 R +/S /Table +/Type /StructElem +>> +endobj +74 0 obj +<< +/K 474 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +75 0 obj +<< +/K [475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 12] +/P 9 0 R +/Pg 15 0 R +/S /Table +/Type /StructElem +>> +endobj +76 0 obj +<< +/K 13 +/P 9 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +77 0 obj +<< +/K [480 0 R 14] +/P 9 0 R +/Pg 15 0 R +/S /H2 +/Type /StructElem +>> +endobj +78 0 obj +<< +/K [481 0 R 482 0 R 483 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +79 0 obj +<< +/K 484 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +80 0 obj +<< +/K [485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 21] +/P 9 0 R +/Pg 15 0 R +/S /Table +/Type /StructElem +>> +endobj +81 0 obj +<< +/K 491 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +82 0 obj +<< +/K [492 0 R 22] +/P 9 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +83 0 obj +<< +/K 493 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +84 0 obj +<< +/K [494 0 R 495 0 R 496 0 R 497 0 R] +/P 9 0 R +/S /L +/Type /StructElem +>> +endobj +85 0 obj +<< +/K 0 +/P 9 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +86 0 obj +<< +/K [498 0 R 1] +/P 9 0 R +/Pg 16 0 R +/S /H2 +/Type /StructElem +>> +endobj +87 0 obj +<< +/K 499 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +88 0 obj +<< +/K [500 0 R 501 0 R 502 0 R 503 0 R 504 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +89 0 obj +<< +/K [505 0 R 2] +/P 9 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +90 0 obj +<< +/K 506 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +91 0 obj +<< +/K 507 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +92 0 obj +<< +/K 3 +/P 9 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +93 0 obj +<< +/K [508 0 R 4] +/P 9 0 R +/Pg 16 0 R +/S /H2 +/Type /StructElem +>> +endobj +94 0 obj +<< +/K 509 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +95 0 obj +<< +/K 510 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +96 0 obj +<< +/K [511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +97 0 obj +<< +/K [521 0 R 522 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +98 0 obj +<< +/K 523 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +99 0 obj +<< +/K [524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +100 0 obj +<< +/K [532 0 R 5] +/P 9 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +101 0 obj +<< +/K [533 0 R 534 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +102 0 obj +<< +/K 535 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +103 0 obj +<< +/K [536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +104 0 obj +<< +/K [544 0 R 545 0 R 546 0 R 547 0 R 548 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +105 0 obj +<< +/K 549 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +106 0 obj +<< +/K [550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +107 0 obj +<< +/K [562 0 R 563 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +108 0 obj +<< +/K [564 0 R 0] +/P 9 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +109 0 obj +<< +/K [565 0 R 1] +/P 9 0 R +/Pg 17 0 R +/S /BlockQuote +/Type /StructElem +>> +endobj +110 0 obj +<< +/K [566 0 R 567 0 R] +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +111 0 obj +<< +/K 568 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +112 0 obj +<< +/K 569 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +113 0 obj +<< +/K 570 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +114 0 obj +<< +/K [571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +115 0 obj +<< +/K 578 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +116 0 obj +<< +/K [579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 586 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +117 0 obj +<< +/K 587 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +118 0 obj +<< +/K [588 0 R 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +119 0 obj +<< +/K 594 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +120 0 obj +<< +/K [595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +121 0 obj +<< +/K [601 0 R 602 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +122 0 obj +<< +/K [603 0 R 604 0 R] +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +123 0 obj +<< +/K 605 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +124 0 obj +<< +/K 606 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +125 0 obj +<< +/K [607 0 R 608 0 R 609 0 R] +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +126 0 obj +<< +/K [610 0 R 611 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +127 0 obj +<< +/K 612 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +128 0 obj +<< +/K [613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R 623 0 R 624 0 R 625 0 R 626 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +129 0 obj +<< +/K 627 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +130 0 obj +<< +/K [628 0 R 629 0 R 630 0 R 631 0 R 632 0 R 633 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +131 0 obj +<< +/K 2 +/P 9 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +132 0 obj +<< +/K [634 0 R 0] +/P 9 0 R +/Pg 18 0 R +/S /H2 +/Type /StructElem +>> +endobj +133 0 obj +<< +/K 635 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +134 0 obj +<< +/K [636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 6] +/P 9 0 R +/Pg 18 0 R +/S /Table +/Type /StructElem +>> +endobj +135 0 obj +<< +/K 642 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +136 0 obj +<< +/K 643 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +137 0 obj +<< +/K [644 0 R 645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +138 0 obj +<< +/K [652 0 R 7] +/P 9 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +139 0 obj +<< +/K 653 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +140 0 obj +<< +/K [654 0 R 655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R 663 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +141 0 obj +<< +/K [664 0 R 8] +/P 9 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +142 0 obj +<< +/K 665 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +143 0 obj +<< +/K [666 0 R 667 0 R 668 0 R 669 0 R 670 0 R 671 0 R 672 0 R 673 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +144 0 obj +<< +/K [674 0 R 9] +/P 9 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +145 0 obj +<< +/K 675 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +146 0 obj +<< +/K [676 0 R 677 0 R 678 0 R 679 0 R 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R 685 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +147 0 obj +<< +/K [686 0 R 10] +/P 9 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +148 0 obj +<< +/K 687 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +149 0 obj +<< +/K [688 0 R 689 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +150 0 obj +<< +/K [690 0 R 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +151 0 obj +<< +/K [696 0 R 0] +/P 9 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +152 0 obj +<< +/K 697 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +153 0 obj +<< +/K 698 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +154 0 obj +<< +/K [699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 7] +/P 9 0 R +/Pg 19 0 R +/S /Table +/Type /StructElem +>> +endobj +155 0 obj +<< +/K [704 0 R 705 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +156 0 obj +<< +/K 706 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +157 0 obj +<< +/K [707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +158 0 obj +<< +/K [713 0 R 8] +/P 9 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +159 0 obj +<< +/K 714 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +160 0 obj +<< +/K 715 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +161 0 obj +<< +/K [716 0 R 717 0 R 718 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +162 0 obj +<< +/K [719 0 R 9 << +/MCID 0 +/Pg 20 0 R +/Type /MCR +>>] +/P 9 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +163 0 obj +<< +/K [720 0 R 721 0 R 722 0 R 723 0 R 724 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +164 0 obj +<< +/K 725 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +165 0 obj +<< +/K [726 0 R 727 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +166 0 obj +<< +/K [728 0 R 1] +/P 9 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +167 0 obj +<< +/K 729 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +168 0 obj +<< +/K 730 0 R +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +169 0 obj +<< +/K 731 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +170 0 obj +<< +/K [732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +171 0 obj +<< +/K 744 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +172 0 obj +<< +/K [745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R 754 0 R 9] +/P 9 0 R +/Pg 20 0 R +/S /Table +/Type /StructElem +>> +endobj +173 0 obj +<< +/K 10 +/P 9 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +174 0 obj +<< +/K [755 0 R 11] +/P 9 0 R +/Pg 20 0 R +/S /H2 +/Type /StructElem +>> +endobj +175 0 obj +<< +/K 756 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +176 0 obj +<< +/K 757 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +177 0 obj +<< +/K [758 0 R 759 0 R 760 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +178 0 obj +<< +/K 761 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +179 0 obj +<< +/K [762 0 R 763 0 R 764 0 R 765 0 R 766 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +180 0 obj +<< +/K 767 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +181 0 obj +<< +/K [768 0 R 769 0 R 770 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +182 0 obj +<< +/K 771 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +183 0 obj +<< +/K [772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R] +/P 9 0 R +/S /P +/Type /StructElem +>> +endobj +184 0 obj +<< +/K 782 0 R +/P 9 0 R +/S /H4 +/Type /StructElem +>> +endobj +185 0 obj +<< +/K [783 0 R 784 0 R 785 0 R 786 0 R] +/P 9 0 R +/S /L +/Type /StructElem +>> +endobj +186 0 obj +<< +/K 787 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +187 0 obj +<< +/K [788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 5] +/P 9 0 R +/Pg 21 0 R +/S /Table +/Type /StructElem +>> +endobj +188 0 obj +<< +/K 6 +/P 9 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +189 0 obj +<< +/K [793 0 R 7] +/P 9 0 R +/Pg 21 0 R +/S /H2 +/Type /StructElem +>> +endobj +190 0 obj +<< +/K 794 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +191 0 obj +<< +/K [795 0 R 796 0 R 797 0 R 798 0 R 799 0 R 14] +/P 9 0 R +/Pg 21 0 R +/S /Table +/Type /StructElem +>> +endobj +192 0 obj +<< +/K 800 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +193 0 obj +<< +/K [801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 21] +/P 9 0 R +/Pg 21 0 R +/S /Table +/Type /StructElem +>> +endobj +194 0 obj +<< +/K 809 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +195 0 obj +<< +/K [810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R 26 << +/MCID 5 +/Pg 22 0 R +/Type /MCR +>>] +/P 9 0 R +/Pg 21 0 R +/S /Table +/Type /StructElem +>> +endobj +196 0 obj +<< +/K 817 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +197 0 obj +<< +/K [818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 10] +/P 9 0 R +/Pg 22 0 R +/S /Table +/Type /StructElem +>> +endobj +198 0 obj +<< +/K 11 +/P 9 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +199 0 obj +<< +/K [823 0 R 12] +/P 9 0 R +/Pg 22 0 R +/S /H2 +/Type /StructElem +>> +endobj +200 0 obj +<< +/K 824 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +201 0 obj +<< +/K [825 0 R 13] +/P 9 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +202 0 obj +<< +/K 826 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +203 0 obj +<< +/K [827 0 R 14] +/P 9 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +204 0 obj +<< +/K 828 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +205 0 obj +<< +/K [829 0 R 0] +/P 9 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +206 0 obj +<< +/K 830 0 R +/P 9 0 R +/S /H3 +/Type /StructElem +>> +endobj +207 0 obj +<< +/K [831 0 R 1] +/P 9 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +208 0 obj +[25 0 R 26 0 R 27 0 R 28 0 R 30 0 R 31 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 345 0 R 347 0 R 349 0 R 35 0 R 250 0 R +251 0 R 252 0 R 253 0 R 353 0 R 355 0 R 357 0 R 37 0 R 306 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R +308 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R 854 0 R +855 0 R 317 0 R 318 0 R 319 0 R 856 0 R 321 0 R 857 0 R 323 0 R 858 0 R 325 0 R 859 0 R 327 0 R 860 0 R 329 0 R 861 0 R 331 0 R +862 0 R 333 0 R 863 0 R 335 0 R 864 0 R 337 0 R 865 0 R 339 0 R 866 0 R 341 0 R 342 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R +872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R +888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R +904 0 R 905 0 R 906 0 R 907 0 R 350 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R +919 0 R 920 0 R 921 0 R 922 0 R 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R +935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R] +endobj +209 0 obj +[250 0 R 251 0 R 252 0 R 253 0 R 359 0 R 361 0 R 37 0 R 40 0 R 42 0 R 44 0 R 46 0 R 47 0 R 48 0 R 254 0 R 255 0 R 256 0 R +257 0 R 384 0 R 52 0 R 908 0 R 909 0 R 910 0 R 911 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R +951 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 362 0 R 363 0 R 962 0 R 364 0 R 963 0 R +964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R +980 0 R 981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R 995 0 R +996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R +1012 0 R 1013 0 R 1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1026 0 R 1027 0 R +1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R 1043 0 R +1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R +1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R +1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R +1092 0 R 366 0 R 1093 0 R 367 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R +1106 0 R 1107 0 R 1108 0 R 1109 0 R 1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R +1122 0 R 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R 369 0 R 1133 0 R 370 0 R 1134 0 R 1135 0 R +1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R +1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R 1166 0 R 1167 0 R +1168 0 R 1169 0 R 372 0 R 1170 0 R 373 0 R 1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R +1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 375 0 R +376 0 R 1197 0 R 378 0 R 1198 0 R 380 0 R 381 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R +1209 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1214 0 R 1215 0 R 1216 0 R 1217 0 R] +endobj +210 0 obj +[254 0 R 255 0 R 256 0 R 257 0 R 386 0 R 388 0 R 390 0 R 52 0 R 258 0 R 259 0 R 260 0 R 402 0 R 404 0 R 406 0 R 408 0 R 410 0 R +57 0 R 58 0 R 261 0 R 262 0 R 263 0 R 60 0 R 1199 0 R 1200 0 R 1201 0 R 1202 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R +1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1229 0 R 1230 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R +1240 0 R 1241 0 R 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R +1256 0 R 391 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R 1267 0 R 1268 0 R 1269 0 R 1270 0 R +1271 0 R 1272 0 R 1273 0 R 1274 0 R 1275 0 R 1276 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R +1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R 1294 0 R 1295 0 R 1296 0 R 1297 0 R 398 0 R 399 0 R 1298 0 R 1299 0 R 1300 0 R +1301 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R +1317 0 R 1318 0 R 1319 0 R 1320 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R 1330 0 R +1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R 1334 0 R 1335 0 R 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R 1342 0 R 1343 0 R 1344 0 R +1345 0 R 1346 0 R 1347 0 R 1348 0 R 1349 0 R 1348 0 R 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R +1359 0 R 1360 0 R 1361 0 R 1362 0 R 413 0 R 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R] +endobj +211 0 obj +[261 0 R 262 0 R 263 0 R 416 0 R 60 0 R 61 0 R 62 0 R 264 0 R 265 0 R 266 0 R 423 0 R 425 0 R 427 0 R 66 0 R 267 0 R 268 0 R +269 0 R 270 0 R 434 0 R 69 0 R 271 0 R 272 0 R 273 0 R 274 0 R 463 0 R 465 0 R 467 0 R 469 0 R 73 0 R 1363 0 R 1364 0 R 1365 0 R +1370 0 R 1371 0 R 1372 0 R 1373 0 R 417 0 R 418 0 R 1374 0 R 420 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R +1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R +1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 428 0 R 429 0 R 1404 0 R 431 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R +1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R 1419 0 R 1420 0 R 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R +1428 0 R 1429 0 R 1430 0 R 437 0 R 1431 0 R 439 0 R 440 0 R 1432 0 R 441 0 R 442 0 R 1433 0 R 443 0 R 444 0 R 1434 0 R 445 0 R 1435 0 R +447 0 R 448 0 R 1436 0 R 449 0 R 450 0 R 1437 0 R 451 0 R 452 0 R 1438 0 R 453 0 R 454 0 R 1439 0 R 455 0 R 456 0 R 1440 0 R 457 0 R +458 0 R 1441 0 R 458 0 R 1441 0 R 459 0 R 460 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1446 0 R 1447 0 R 1448 0 R 1449 0 R 1450 0 R 1451 0 R +1452 0 R 1453 0 R 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R 1459 0 R 1460 0 R 1461 0 R 1462 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R 1467 0 R +1468 0 R 1469 0 R 1470 0 R 1471 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R 1483 0 R +1484 0 R 1485 0 R] +endobj +212 0 obj +[271 0 R 272 0 R 273 0 R 274 0 R 471 0 R 473 0 R 73 0 R 275 0 R 276 0 R 277 0 R 477 0 R 479 0 R 75 0 R 76 0 R 77 0 R 278 0 R +279 0 R 280 0 R 1486 0 R 487 0 R 489 0 R 80 0 R 82 0 R 1442 0 R 1443 0 R 1444 0 R 1445 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R +1492 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1498 0 R 1499 0 R 1500 0 R 1501 0 R 1502 0 R 1503 0 R 1504 0 R 1505 0 R 1506 0 R 474 0 R +1507 0 R 1508 0 R 1509 0 R 1510 0 R 1511 0 R 1512 0 R 1513 0 R 1514 0 R 1515 0 R 1516 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R 1521 0 R 480 0 R +481 0 R 482 0 R 1522 0 R 483 0 R 484 0 R 1523 0 R 1524 0 R 1525 0 R 1526 0 R 1527 0 R 1528 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R 1533 0 R +1534 0 R 1535 0 R 1536 0 R 1537 0 R 1538 0 R 1539 0 R 1540 0 R 1541 0 R 1542 0 R 1543 0 R 1544 0 R 1545 0 R 1546 0 R 1547 0 R 1548 0 R 491 0 R +1549 0 R 1550 0 R 1551 0 R 1552 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R 1557 0 R 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R +1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1570 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R 1579 0 R 1580 0 R +1581 0 R 1582 0 R 1583 0 R 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R 1594 0 R 1595 0 R 1596 0 R +1597 0 R 1598 0 R 1599 0 R 1600 0 R 1601 0 R 1602 0 R 1603 0 R 1604 0 R 1605 0 R 1606 0 R 1607 0 R 1608 0 R 1609 0 R 1610 0 R 1611 0 R 1612 0 R +1613 0 R 1614 0 R 1615 0 R 1616 0 R 1617 0 R 1618 0 R 1619 0 R 1620 0 R 1621 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R +1629 0 R 1630 0 R 1631 0 R 1632 0 R 1633 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R 1639 0 R 1640 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R +1645 0 R 1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R 1658 0 R 493 0 R 1659 0 R +1660 0 R 1661 0 R 1662 0 R 1663 0 R 1664 0 R 1665 0 R 1666 0 R 1667 0 R 1668 0 R 1669 0 R 1670 0 R 1671 0 R 1672 0 R 1673 0 R 1674 0 R 1675 0 R +1676 0 R] +endobj +213 0 obj +[85 0 R 86 0 R 89 0 R 92 0 R 93 0 R 100 0 R 498 0 R 499 0 R 500 0 R 501 0 R 1677 0 R 502 0 R 503 0 R 1678 0 R 504 0 R 1679 0 R +506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 1680 0 R 512 0 R 1681 0 R 514 0 R 515 0 R 1682 0 R 516 0 R 517 0 R 1683 0 R 518 0 R 519 0 R +1684 0 R 520 0 R 1685 0 R 522 0 R 523 0 R 1686 0 R 525 0 R 1687 0 R 527 0 R 528 0 R 1688 0 R 529 0 R 1689 0 R 531 0 R 1690 0 R 1691 0 R +1692 0 R 1693 0 R 1694 0 R 1695 0 R 1696 0 R 1697 0 R 1698 0 R 1699 0 R 1700 0 R 1701 0 R 1702 0 R 1703 0 R 1704 0 R 1705 0 R 1706 0 R 1707 0 R +1708 0 R 1709 0 R 1710 0 R 1711 0 R 1712 0 R 1713 0 R 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1720 0 R 1721 0 R 1722 0 R 1723 0 R +1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R 1729 0 R 1730 0 R 1731 0 R 1732 0 R 1733 0 R 1734 0 R 1735 0 R 534 0 R 535 0 R 1736 0 R 537 0 R +1737 0 R 539 0 R 540 0 R 1738 0 R 541 0 R 542 0 R 1739 0 R 543 0 R 1740 0 R 545 0 R 546 0 R 1741 0 R 547 0 R 548 0 R 1742 0 R] +endobj +214 0 obj +[108 0 R 109 0 R 131 0 R 549 0 R 1743 0 R 551 0 R 1744 0 R 553 0 R 554 0 R 1745 0 R 555 0 R 556 0 R 1746 0 R 557 0 R 558 0 R 1747 0 R +559 0 R 560 0 R 1748 0 R 561 0 R 1749 0 R 563 0 R 1750 0 R 1751 0 R 1752 0 R 1753 0 R 1754 0 R 1755 0 R 1756 0 R 1757 0 R 1758 0 R 1759 0 R +1760 0 R 1761 0 R 1762 0 R 1763 0 R 1764 0 R 1765 0 R 1766 0 R 1767 0 R 1768 0 R 1769 0 R 1770 0 R 1771 0 R 1772 0 R 1773 0 R 1774 0 R 1775 0 R +1776 0 R 1777 0 R 1778 0 R 566 0 R 1779 0 R 568 0 R 569 0 R 570 0 R 1780 0 R 572 0 R 1781 0 R 574 0 R 575 0 R 1782 0 R 576 0 R 577 0 R +1783 0 R 578 0 R 1784 0 R 580 0 R 1785 0 R 582 0 R 583 0 R 1786 0 R 584 0 R 585 0 R 1787 0 R 586 0 R 587 0 R 1788 0 R 589 0 R 1789 0 R +591 0 R 592 0 R 1790 0 R 593 0 R 594 0 R 1791 0 R 596 0 R 1792 0 R 598 0 R 599 0 R 1793 0 R 600 0 R 1794 0 R 602 0 R 603 0 R 1795 0 R +605 0 R 606 0 R 607 0 R 608 0 R 1796 0 R 609 0 R 1797 0 R 611 0 R 612 0 R 1798 0 R 614 0 R 1799 0 R 616 0 R 617 0 R 1800 0 R 618 0 R +619 0 R 1801 0 R 620 0 R 621 0 R 1802 0 R 622 0 R 623 0 R 1803 0 R 624 0 R 625 0 R 1804 0 R 626 0 R 627 0 R 1805 0 R 629 0 R 1806 0 R +631 0 R 632 0 R 1807 0 R 633 0 R] +endobj +215 0 obj +[132 0 R 281 0 R 282 0 R 283 0 R 638 0 R 640 0 R 134 0 R 138 0 R 141 0 R 144 0 R 147 0 R 634 0 R 635 0 R 1808 0 R 1809 0 R 1810 0 R +1811 0 R 1812 0 R 1813 0 R 1814 0 R 1815 0 R 1816 0 R 1817 0 R 1818 0 R 1819 0 R 1820 0 R 1821 0 R 1822 0 R 1823 0 R 1824 0 R 1825 0 R 642 0 R +643 0 R 1826 0 R 645 0 R 1827 0 R 647 0 R 1828 0 R 649 0 R 650 0 R 1829 0 R 651 0 R 1830 0 R 1831 0 R 1832 0 R 1833 0 R 1834 0 R 653 0 R +1835 0 R 655 0 R 1836 0 R 657 0 R 658 0 R 1837 0 R 659 0 R 1838 0 R 661 0 R 662 0 R 1839 0 R 663 0 R 1840 0 R 1841 0 R 1842 0 R 1843 0 R +1844 0 R 1845 0 R 1846 0 R 665 0 R 1847 0 R 667 0 R 1848 0 R 669 0 R 670 0 R 1849 0 R 671 0 R 1850 0 R 673 0 R 1851 0 R 1852 0 R 1853 0 R +1854 0 R 1855 0 R 1856 0 R 1857 0 R 1858 0 R 1859 0 R 1860 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1865 0 R 1866 0 R 1867 0 R 1868 0 R 1869 0 R +1870 0 R 1871 0 R 1872 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R +1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 675 0 R 1892 0 R 677 0 R 1893 0 R 679 0 R 680 0 R 1894 0 R 681 0 R 1895 0 R 683 0 R +1896 0 R 685 0 R 1897 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R] +endobj +216 0 obj +[151 0 R 284 0 R 285 0 R 286 0 R 287 0 R 701 0 R 703 0 R 154 0 R 158 0 R 162 0 R 687 0 R 1903 0 R 689 0 R 1904 0 R 691 0 R 692 0 R +1905 0 R 693 0 R 694 0 R 1906 0 R 695 0 R 1907 0 R 1908 0 R 1909 0 R 1910 0 R 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R 1917 0 R +1918 0 R 1919 0 R 1920 0 R 1921 0 R 1922 0 R 1923 0 R 1924 0 R 1925 0 R 1926 0 R 1927 0 R 1928 0 R 1929 0 R 1930 0 R 1931 0 R 1932 0 R 1933 0 R +1934 0 R 1935 0 R 705 0 R 1936 0 R 707 0 R 1937 0 R 708 0 R 709 0 R 1938 0 R 710 0 R 711 0 R 1939 0 R 712 0 R 1940 0 R 1941 0 R 1942 0 R +1943 0 R 1944 0 R 1945 0 R 1946 0 R 1947 0 R 1948 0 R 1949 0 R 1950 0 R 1951 0 R 1952 0 R 1953 0 R 1954 0 R 1955 0 R 714 0 R 1956 0 R 716 0 R +717 0 R 1957 0 R 718 0 R 1958 0 R 1959 0 R 1960 0 R 1961 0 R 1962 0 R 1963 0 R 1964 0 R 1965 0 R 1966 0 R 1967 0 R 1968 0 R 1969 0 R 1970 0 R +1971 0 R 1972 0 R 1973 0 R 1974 0 R 1975 0 R 1976 0 R 1977 0 R 1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R +1987 0 R 1988 0 R 1989 0 R 1990 0 R 1991 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R 1996 0 R 1997 0 R 1998 0 R 1999 0 R 2000 0 R 2001 0 R 2002 0 R +2003 0 R 2004 0 R 2005 0 R 2006 0 R 2007 0 R 2008 0 R 2009 0 R 2010 0 R 2011 0 R 2012 0 R 2013 0 R 2014 0 R] +endobj +217 0 obj +[162 0 R 166 0 R 288 0 R 289 0 R 290 0 R 747 0 R 749 0 R 751 0 R 753 0 R 172 0 R 173 0 R 174 0 R 2015 0 R 2016 0 R 2017 0 R 2018 0 R +2019 0 R 2020 0 R 720 0 R 721 0 R 2021 0 R 722 0 R 2022 0 R 724 0 R 2023 0 R 726 0 R 2024 0 R 727 0 R 2025 0 R 2026 0 R 2027 0 R 2028 0 R +2029 0 R 2030 0 R 2031 0 R 2032 0 R 2033 0 R 2034 0 R 2035 0 R 2036 0 R 2037 0 R 2038 0 R 2039 0 R 2040 0 R 2041 0 R 2042 0 R 2043 0 R 2044 0 R +2045 0 R 2046 0 R 2047 0 R 2048 0 R 2049 0 R 2050 0 R 2051 0 R 2052 0 R 2053 0 R 2054 0 R 2055 0 R 2056 0 R 2057 0 R 2058 0 R 2059 0 R 2060 0 R +2061 0 R 2062 0 R 2063 0 R 2064 0 R 2065 0 R 2066 0 R 2067 0 R 2068 0 R 2069 0 R 2070 0 R 2071 0 R 2072 0 R 2073 0 R 2074 0 R 2075 0 R 2076 0 R +2077 0 R 2078 0 R 2079 0 R 2080 0 R 2081 0 R 2082 0 R 2083 0 R 2084 0 R 2085 0 R 729 0 R 730 0 R 731 0 R 2086 0 R 733 0 R 2087 0 R 735 0 R +2088 0 R 737 0 R 738 0 R 2089 0 R 739 0 R 2090 0 R 741 0 R 742 0 R 2091 0 R 743 0 R 744 0 R 2092 0 R 2093 0 R 2094 0 R 2095 0 R 2096 0 R +2097 0 R 2098 0 R 2099 0 R 2100 0 R 2101 0 R 2102 0 R 2103 0 R 2104 0 R 2105 0 R 2106 0 R 2107 0 R 2108 0 R 2109 0 R 2110 0 R 2111 0 R 2112 0 R +2113 0 R 2114 0 R 2115 0 R 2116 0 R 2117 0 R 2118 0 R 2119 0 R 2120 0 R 2121 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 2122 0 R 760 0 R +761 0 R 762 0 R 763 0 R 2123 0 R 764 0 R 765 0 R 2124 0 R 766 0 R 767 0 R 768 0 R 769 0 R 2125 0 R 770 0 R] +endobj +218 0 obj +[291 0 R 292 0 R 293 0 R 790 0 R 792 0 R 187 0 R 188 0 R 189 0 R 294 0 R 295 0 R 296 0 R 297 0 R 797 0 R 799 0 R 191 0 R 298 0 R +299 0 R 300 0 R 803 0 R 805 0 R 807 0 R 193 0 R 301 0 R 302 0 R 303 0 R 812 0 R 195 0 R 771 0 R 772 0 R 2126 0 R 773 0 R 774 0 R +2127 0 R 775 0 R 776 0 R 2128 0 R 777 0 R 778 0 R 2129 0 R 779 0 R 780 0 R 2130 0 R 781 0 R 782 0 R 2131 0 R 2132 0 R 2133 0 R 2134 0 R +2135 0 R 2136 0 R 2137 0 R 2138 0 R 2139 0 R 2140 0 R 2141 0 R 2142 0 R 2143 0 R 2144 0 R 2145 0 R 2146 0 R 2147 0 R 2148 0 R 2149 0 R 2150 0 R +2151 0 R 2152 0 R 2153 0 R 2154 0 R 2155 0 R 2156 0 R 2157 0 R 2158 0 R 2159 0 R 787 0 R 2160 0 R 2161 0 R 2162 0 R 2163 0 R 2164 0 R 2165 0 R +2166 0 R 2167 0 R 2168 0 R 2169 0 R 2170 0 R 2171 0 R 2172 0 R 2173 0 R 2174 0 R 793 0 R 794 0 R 2175 0 R 2176 0 R 2177 0 R 2178 0 R 2179 0 R +2180 0 R 2181 0 R 2182 0 R 2183 0 R 2184 0 R 2185 0 R 2186 0 R 2187 0 R 2188 0 R 2189 0 R 2190 0 R 2191 0 R 2192 0 R 2193 0 R 2194 0 R 800 0 R +2195 0 R 2196 0 R 2197 0 R 2198 0 R 2199 0 R 2200 0 R 2201 0 R 2202 0 R 2203 0 R 2204 0 R 2205 0 R 2206 0 R 2207 0 R 2208 0 R 2209 0 R 2210 0 R +2211 0 R 2212 0 R 2213 0 R 2214 0 R 2215 0 R 2216 0 R 2217 0 R 2218 0 R 809 0 R 2219 0 R 2220 0 R 2221 0 R 2222 0 R 2223 0 R 2224 0 R 2225 0 R +2226 0 R 2227 0 R] +endobj +219 0 obj +[301 0 R 302 0 R 303 0 R 814 0 R 816 0 R 195 0 R 304 0 R 305 0 R 820 0 R 822 0 R 197 0 R 198 0 R 199 0 R 201 0 R 203 0 R 2219 0 R +2220 0 R 2221 0 R 2228 0 R 2229 0 R 2230 0 R 2231 0 R 2232 0 R 2233 0 R 2234 0 R 2235 0 R 2236 0 R 2237 0 R 2238 0 R 2239 0 R 817 0 R 2240 0 R +2241 0 R 2242 0 R 2243 0 R 2244 0 R 2245 0 R 2246 0 R 2247 0 R 2248 0 R 2249 0 R 823 0 R 824 0 R 2250 0 R 826 0 R 2251 0 R] +endobj +220 0 obj +[205 0 R 207 0 R 828 0 R 2252 0 R 2253 0 R 2254 0 R 2255 0 R 2256 0 R 2257 0 R 2258 0 R 2259 0 R 2260 0 R 2261 0 R 2262 0 R 2263 0 R 2264 0 R +2265 0 R 2266 0 R 2267 0 R 2268 0 R 2269 0 R 2270 0 R 2271 0 R 2272 0 R 2273 0 R 2274 0 R 2275 0 R 2276 0 R 2277 0 R 2278 0 R 2279 0 R 2280 0 R +2281 0 R 2282 0 R 2283 0 R 2284 0 R 2285 0 R 2286 0 R 2287 0 R 2288 0 R 2289 0 R 2290 0 R 2291 0 R 2292 0 R 2293 0 R 2294 0 R 2295 0 R 2296 0 R +2297 0 R 2298 0 R 2299 0 R 2300 0 R 2301 0 R 2302 0 R 2303 0 R 2304 0 R 2305 0 R 2306 0 R 2307 0 R 2308 0 R 2309 0 R 2310 0 R 2311 0 R 2312 0 R +2313 0 R 2314 0 R 2315 0 R 2316 0 R 2317 0 R 2318 0 R 2319 0 R 2320 0 R 2321 0 R 2322 0 R 2323 0 R 2324 0 R 2325 0 R 2326 0 R 2327 0 R 2328 0 R +2329 0 R 2330 0 R 2331 0 R 2332 0 R 2333 0 R 2334 0 R 2335 0 R 2336 0 R 2337 0 R 2338 0 R 2339 0 R 2340 0 R 2341 0 R 2342 0 R 2343 0 R 2344 0 R +2345 0 R 2346 0 R 2347 0 R 2348 0 R 2349 0 R 2350 0 R 2351 0 R 2352 0 R 2353 0 R 2354 0 R 2355 0 R 2356 0 R 2357 0 R 2358 0 R 2359 0 R 2360 0 R +2361 0 R 2362 0 R 2363 0 R 2364 0 R 2365 0 R 2366 0 R 2367 0 R 2368 0 R 2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R 2374 0 R 2375 0 R 2376 0 R +2377 0 R 2378 0 R 2379 0 R 2380 0 R 2381 0 R 2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R 2387 0 R 2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R +2393 0 R 2394 0 R 2395 0 R 2396 0 R 2397 0 R 2398 0 R 830 0 R 2399 0 R 2400 0 R 2401 0 R 2402 0 R 2403 0 R 2404 0 R 2405 0 R 2406 0 R 2407 0 R +2408 0 R 2409 0 R 2410 0 R 2411 0 R 2412 0 R 2413 0 R 2414 0 R 2415 0 R 2416 0 R 2417 0 R 2418 0 R 2419 0 R 2420 0 R 2421 0 R 2422 0 R 2423 0 R +2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R 2429 0 R 2430 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R 2435 0 R 2436 0 R 2437 0 R 2438 0 R 2439 0 R +2440 0 R 2441 0 R 2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R 2447 0 R 2448 0 R 2449 0 R 2450 0 R 2451 0 R 2452 0 R 2453 0 R] +endobj +221 0 obj +<< +/AP << +/N 2454 0 R +>> +/C [1 0.933 0.345] +/CreationDate (D:20260315234914+09'00') +/F 4 +/M (D:20260315234914+09'00') +/NM (1e5fa9cc-b41f-44a2-a3730b5470b09b9e) +/P 11 0 R +/QuadPoints [53.999996 692.912842 145.636917 692.912842 53.999996 682.937256 145.636917 682.937256] +/Rect [51.933987 682.937256 147.702927 692.912842] +/Subj (p \\) +/Subtype /Highlight +/T (lifew) +/Type /Annot +>> +endobj +222 0 obj +<< +/AP << +/N 2455 0 R +>> +/C [1 0.933 0.345] +/CreationDate (D:20260315234916+09'00') +/F 4 +/M (D:20260315234916+09'00') +/NM (43450254-1366-4805-93dfa341e476cefa) +/P 11 0 R +/QuadPoints [149.914261 692.912842 213.491974 692.912842 149.914261 682.937256 213.491974 682.937256] +/Rect [147.848251 682.937256 215.557983 692.912842] +/Subj (p \\) +/Subtype /Highlight +/T (lifew) +/Type /Annot +>> +endobj +223 0 obj +<< +/Filter /FlateDecode +/Length 7459 +>> +stream +x][+q~ׯ-x+`a@Ҍq; 9>ɬ?Q8bHSCu#?VZ-?Hv/'c_E@dPӿ_N륷nO]wO}Wf~}_r=YX_"Ei%𴬖ҲZ(}ʹtz/?M8҂ B7/w!֞?_ۗmXM:,ʶPp̹5b`聜WL2k?jf>,ź4ƥ6һmSi6JhmJ)4uݦs(mbanfbo{+!@QBȽB +b UIDBb ydU܌l>mGfY:\S&i4GF 8RDBsl!LXclÒ4Xcl斲ԦO6e}[g݈11$H@;1$F@cõ6b mD Y^F1FjbmI:6b mD n4141Phch#b$c:3`clb%wcl`%Ԧ/J^[1+ƕIJŔqb۷++"X w }orcsq 枣ym8-*@F\m؍bZ#q8hsqD"3GQ$=-STғS"6(Ha~ @6,n86pF$ō0ű ȍ&F¢Ca1 xʍaql#lX df6y* 3GdL3Shdql,rű,&,n9rn&űCaѹE3,:ܰ(<4h&3)JEpC(w7LjO&' CO` _p{w@~7 pG(} B`닌irRɢ_VRΐlwt0ȉYDvb>}' 0 CyhhpWcypxwe2no )Y1D|pWWqOZ}f6dByt@T>y7KYk Ypvߘpm]5)u8'T`cP"]9kjM0e&Zх Lw4T4\+8M,F"ŮW Vl S#Pw B]@[^[b5hs0㊜VW=Jc>_Ywh+iaoEܞ٢["7{.2:[?ޏ Zn]VP ߽W5&Tu+9/w`@ a僔t%+fy+$g\Q=݃e8`nhAaVEj J']# +5< 꺏]]ؼ.|\]I iL=Vcs By?G BJ/#=xl6&~ bDb-=CCLjFא䖀7><4tE6/..>=C+59\+58-WסR*򄺽Mnߺ >irb>qKzT1D-+&9be@(B3_u114h r-/,̷.$|z.'wAJZ̤ab8T =l!o!xh2}< C(o9r! z# D- ξ9 +dW.X `+ +3iZoJ,9L=~0-ZOWA2ˤ\H#CzIf:>Qy=zGŝgCL 㥰b l ;0m:Yznjѡvɭ^T˪.Rej`k6W XGj{pq۫]Y^5֌Rقo%%k[;Ci$ԓ-G8K8`*6۸-rڢG>d++\> +~.!JTSSr]slN"B-gdD ̾k)a$~ijX,M3|6ƶ{,yS*(xv|SO8'Q1/۵5&kЫpӖMJ$v,97"6E[?ǹcy!f` 6my(G.%|GT8?OzWɓ1p|3䗋x;>7Bߏdae7TMu'2d0 (\'-> AŃB$ʆrQH:#EKNcll2"q;C\s9=O]oM":?9VMvi;| +1f 4kz5ydiP"}g174HH) $DO҂p#Ӹkϴ 4kdƒPM/Bqu|9cߤ ȫ>8P7.0>jrPODA` _5Lu`R`cTcb&X;hd+QYe=cؖ?o'ݐ EwIIT1Iɗ+DED$ZiQkl*+b}N[&2/&۰ڊ6-ݜXqF^0N!2\z]Z>ZoEޖ"Jla0Xa00`G#5F xjv` 2iA.N gd L Sg rG^x +nCmim}2c,٤8cb S"2`FW yM^D4hQѭ[Ϙl[L6I7`K+QEhL.8e`]U\\"jo`ƲA,d9AXy3akuzUU$KhrLUvGAd!rD٠M3φH:l8dDz(l!ҙ-D:؃H'+EB^=v i H[DڃH-DʅQy)4BdVև^pz5ou1 ᤩECdSHi (aH;F!EHoBz ;.Bzl͜L ![3>;hjd咍IMJ>ԜTK)]Mj5[˜~@ +7=A.=j(C#GҷSZ2wC\T|pVYu͆#.@Y|&PXvz:PFv<2͉P#XOݍ)hP@34CܤW6WC!_M +4Ck^Pj/5ߢf{5RP35JЫN3MJZ1M165l*]klfh'`R&،a6c؉,cnƴ1fL;.nƴ,cҸf7[3@;jjd唍IMJ>ԴTK)]f5c!˼~p!pF(pk<1j, x3:3F3po[|#-72[|#72{FfoyrJ2vJTCu@ +3P"hnq` J!d+latS`Zf3sg\/p`:{c} Ser0)/]]7Lk!2Ftm3I Ss '$'y" o4VKzgݟ:C ݗnh*HOf>+}G KrYr|a'\PwGrgB9lEÁv~@|*OGkWd75Xb=8<] jeG'-+1 vFD[jekeMis4ZNL ;`6Ӷ` Gꌍ=87fƦ?䙖&a잘65;'N&ͩdagyĴyĴ)#K^߽񻂶I|F"3_F+'5-á],֤m猉%E0탖eIJ' +4B,kS:(yn!8\{1I7DSwOK45^`. B͙p%ښ W#ݓRb=)"S1I =.=fZw'w4˕}:4YSUҹVS!sS8%O:)MyiN=4J:)[yČqlך)j)WSC+l\*m(7WtMե_9Cfl3dOøB÷ajw/Z0@xyKyNƽ.{I˧?&W5W̫ǗsqE<8dV\<Pl E?Zt[@nE܋"nbۘ-=@vE٢݋٢Zhі%~˗wUP3eBΙ*"-*QKUŘk3/un?Um+JDz8lkO/ tsP_xE1?^D)QGRae"ݽR$̟. 6a͞.J{(Eiv9좴vQڢ%A)J5L!Й<\TqeMZS4\S,6bu3,*a'_Rҁ^ >d hYdbFX$ZbX|,ۥ'#%J֎E&oL$#Xdr)X$c3H RYw]w4=rwdw.Mwr-x MC}tM٥u! խX&@00 r|-P=g s{ZՃUS=k5v+_nQR_,*B_Knb3`ٰ Mo*Na氊,a氊i۰3`f/'e;ƜW7^U&̘c*l)&R"dԛ*0M⩦8#4bS>-&2WM0ߡ\*0>\* w ^`P&Tc(1+c81c0V8bSb*piL9GNW9\P9fDzՍMj(]YV&c]ς#w3azi@BW^o:laYqh|i߀)@r鸯Y: +zXA~[9"ovb,N1^SisŴm dy m|WQr\;1!֣2^1Lg)M(yARaU +f51`2L &mʟf~;vl)U`+5I-%(&HiV_5pJY%` B+`ÆRo Bޟr*5rʤ&g%sw5=DRVSE̠4(> +endobj +225 0 obj +<< +/BaseFont /AAAAAA+MalgunGothicBold +/DescendantFonts [2456 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 2457 0 R +/Type /Font +>> +endobj +226 0 obj +<< +/BaseFont /BAAAAA+MalgunGothic +/DescendantFonts [2458 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 2459 0 R +/Type /Font +>> +endobj +227 0 obj +<< +/CharProcs << +/g0 2460 0 R +/gF4C 2461 0 R +/gF7C 2462 0 R +/gFA2 2463 0 R +>> +/CIDToGIDMap /Identity +/Encoding << +/Differences [0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /gF4C /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /gF7C /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /gFA2] +/Type /Encoding +>> +/FirstChar 0 +/FontBBox [166 328 2460 -1763] +/FontDescriptor 2464 0 R +/FontMatrix [0.00048828125 0 0 -0.00048828125 0 0] +/LastChar 177 +/Resources << +/XObject << +/XgF4C 2465 0 R +/XgF7C 2466 0 R +/XgFA2 2467 0 R +>> +>> +/Subtype /Type3 +/ToUnicode 2468 0 R +/Type /Font +/Widths [1322 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 2812 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 2812 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 2812] +>> +endobj +228 0 obj +<< +/BaseFont /DAAAAA+Consolas +/DescendantFonts [2469 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 2470 0 R +/Type /Font +>> +endobj +229 0 obj +<< +/Filter /FlateDecode +/Length 10108 +>> +stream +x}[$;n{|6*}n۞ŢAR*";Y]tF1E%(m +WfL1lµ}øR ֧?\܆6}jk*A)l#]7#oy/{wZb W]u*hԲT:&aQWz )z٭dWtmOkk_v,j% 2BdV+Y-`[NK9i)cK9L-m9wr>-xPyظ 2b"BI[9JVþ*[P}! ,JldunPn/vC{%:x (K>(hWLyu{JQ~P=B9P׹NŔאNא9cQ׹ګ?:S^?:6폼8Cn3m7dJjf:n]UK~\lXo>¼P1с)+ǂt~!$i+pT/| x%0aHD~F9 wpْ +]MNs̶"~I~lečjjz`X,wLA3e>'5ʇP#KPҐ8s[0D)L.93QEWN],OLQgbR`KHC&kɹd@W(xHۥŌQ#-ߪlC<:e1!,cHC +uSzm&<O4xhYemf,̨0bliݐQ+ucCC.X#xL?`OL SdaTkJr5H)S:b;=F0`[~0b414ajrFD1uZ3*Fe͹鵙C(#B##f##F0FG`# ]1"`QF0L=`Du|VGs3>mf,̨0bliݐQ+ucCC.X#Q[4E#% !%ljT`FF0FTglk*I0/To)Uňb?M1JUYCw{#k"]X֘X Xʲ!F >W3HD$"؃D| &@w@"b: #v0"bK1یQDt̘0a;lliX1P+rcC="X!XBD}9"4bղM&ޙE0y?`AӄAQAۼU;{7хe-I}~1emBĖcLW/---HīlϭQ:t4w&<#]QG9Υ?Ƿȳ\- ]9~A_Jc~oC' +Rr' +SḺ~*v*ͪ n]ޣG +а>Ttf.]BS(g˙WFlIi͓>fvi")Iy%qxeK JI -&}lAbIerKm(#@|/mEswϓ_T_/@_UHBw)jfXVj+[淆[V6lٍ)VQa\H"Nݹ9a EĤDB=( DIfesޙ1WPE1,rLBtxဿCI"s'/LJ$N!3sV0~u(]INW]_0yJXS cg]Ld1xdj+tɾV$Ĵe+J&3r9Z qLU:>.(y*%/˜ڧOᶼRI\M(lSG_'r? *.Or+}‰v芢p%n<vP3aYvmc]BրTTgΙ79^[){;g;bG1.k1Mָȭ!6XjlU]/_ʂ{)Ksp֥P;ϾKݚ;dȷ/seN<'PbL%_=@uX2fҾ gD" {wB*+wb9) L0;0ƻ0F qȰg!"0;0;00;0uQP@?Q~2F T0ƹU3t5APDpLgʉJ,~VWBU+JQ<[élmgM#&.Rꋎ +eWhpVv)7iwh%:LyIk_B*W󕽤`N; vvn``,K̚ +wTayLwbBM`Ywz1b]̕ˏ +!};k};k,yJ>+~ `e7eǨޓU_EG7䔿څ 5?Xwg!Xdy:AnzXy׃,x ,AEV%t" \oU]% $9u''u913%+QYLdjm]Y?:>.,@454\ 8ܸh<3=`<15"! DUMvL@^ԺT4Zaj_+2hU4y@ը @ۨC3Gg ؞kR2f5jLJߘP1Ն_El/^05cA'\y@v=VkMN6~kW{=zY5-C _5_` d~];I dd? +LcT;W^[7z +y!w[M}MPC7a-i~g(zMPJn3ryS}o ES%cw)1E%]NA$j5#AvT>_r|\cԒc_yNedS_(.WUC<9dN}fES_ d"#yyJrc{45/1Mi˪?) +[hTUF`Zj:UP C}L>}\఻L(g3jq<uZ3Ue͸+yIzII +Jd5SɑҜz,ڬ7d bCJ# Ljŕ+=Ь{P:̼x07|$w%^1+ mU7\-?\df"Rƍ$h&_5)lKW[5%64g>Q9V`x2#E260ӓ3Z~l51*]Lg!leWh#`ǦI E4ɹ((ŕVJeWn!.k $IzlHiNMRն$+F 2xlZHH⫀74Ǭ'$-L{>,@& :ɓ0M}kQ<6M]YV*@HcS g$V A9?6IpzFd32xlZHB: *A]K`[#&~=AA\^ +s}՝:~}Sh}F t&;qSN47\7G~f_:_ȫD[j?~c4Ѡi(ެ^3"-r^*Waܙm<:H۫;7Lvyq0Sb8 +/&\]>T7Yl!xؒ7oCdƝ߄uŞ7<~/ ~77=BY1 AޜIC=Ee}-vd4ctAeix +TL/ DN~r^bJ7be0bdM7*dSs%`af[4Crpg(| 932L&Qv v)ʈI:zd|!Pns:p zGMMP+'ԃY{)HL|J1Gp!g0~Mf`.cd]FS^ !d4y%2g^μ&63}t[ %Ln H JdF&#ra#ͯ̒&vفqKj 6g*ml);p}btd92ŏ~_(;y?Zm#VDsZ F8bq~V ۺ6bYh=Z16ˢ18׋pjX=նkϘ·3k)~'=f/{1K~563lObq~> .bh;V[W.l2-6[4{ix`Kbc<dl@i؀0 i؂3 X= ulA%b`<= +WyQ>| + iW8,._ߐSXֺ̦ēj}wb0"=|4lF7p%ӷ1 %ߵB0BؚpIݶ^BXG7xy+n1"Th^{ak&LtO,‹\lBak_@§DžOr$1`JiT'ֳGm݃;>=Q\?[qC̋G0[74)&9O.M~Sa +4U2Qây)I=jXe[MaY#p^#V&j`}IU]֫ +Qέ+K_4G1j!!W[pW9}2ȐU7*`-9]U+Nե!T,y? C4''* *}tAebcAe @escA /Ro, [x9I˓QkPYɺ +*DKNrΨCGE%bCDP;{(#BI6BۉFʽÊ\ghw02RE*{˧= U] +OɩMu'=T] >Y$gpD!Y1ɓ Fs;Q/Nx4+Z$bv-vl,euHsY$m3Z,r^M3_$mc +ĩH\5 CX*qw}B +*weJ)Uy ^Onv5r_%M|o岥*;-_lXr|\9O/_]z y /{Sv?d1 e;s?%үMu _˗.8_2DC.JT:8 mڤM^jgɛZKͻ<%ofzՐ;!dC|[:9=é`$:[^>~h382s5",uV +x,p( P0RA! /|6w-Cv]?S(ۺY Fѳj|Tܢ Eyjy#[@J'91 +BZx)|3\^ypaGY{٠`*рCڤ\/gz3owpsV3*,M7®wp~8^=D*KpӋiI `c +|[o՗o߽^*<'VrY֗gJ~s](w=2"|wQ^^$yK2ka*P92Lw;I)Pm *>j}Q2٫dkl=V t\Sd^4M}z%d LA`A6*3Av+8Xr^Q '۬XrA@ sL0 Ũ_wxY2M޺> +endobj +231 0 obj +<< +/BaseFont /FAAAAA+MalgunGothicBold +/DescendantFonts [2473 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 2474 0 R +/Type /Font +>> +endobj +232 0 obj +<< +/Filter /FlateDecode +/Length 14868 +>> +stream +x}]m}}]}Ng,d\''m{8IzNUO͌m`o%R%C;ӯkw/|>K'/{8EWן~/w_ه̵ɗկ jJ=p??廿w?oɝ~˧O| +%B"?-emQ +Z8)Qk_-Gnʞ{s;Q?Yi-8?VVHJIu'&O-elTn)ElTnIt͈RԒҎ-hɧ[OD>kOrވ&[UrtSj|K4H)k1rX +}cXԬ*|㬵$>aUhSFq+uv,vr,v13ʦc؁C1Uj[y=#^5Β(nu-ż&^#K15ם3iL);k)浔ץJy] lnyN;P\x="^ؑ׵ʵx]1Tqֱ6:^f[bk:5j: +"VTalq~t EU۵lwRؗ(@C^_G˨Vʜ8ܪ Pm+}UKĎ=ܪX-UUݕj%j1f) Xrkf]T-Z_XB_fo'fJnLJuiZc bӨNf4O4Hp,R}dYmM=\(q.#[l.(vb-\pm.)q"Ewb-Gp{bod勚=rRL??rYq6.(vb-\pm.F(q7ڎ\mx-mC>m\F#[ KlTn#R};rc.WǑR>:(qɵ;\nv.9v:ŏi.ge0 S<ǐv"_(LcHݣ}t1[ҡ̥or(J?,Zv Lcs{݇,*4M'+9[IJbٹ iL.Ξ%O؈__<凗?Nj5IV߽|o._1ީџsm>Bŗtq\^f)sq=6܅*\L@R N?{w.;碫ɵ;]=MJJb%vyՊ=~g 8Uow' iw/N/yEVO]-WOP!V-z96{jj:GA;sTeΧ//ѿڅ{%k$р&UN}OEh'RkBugkd' }9ڼ\곖'`ms}(km}H샏~'Q B|՗J8sю:4"zx%@/Y#jsճOU.=3Lj^}!0^r FVJa*1{z րR//1?̱ Q7Y`xxمJ.5F۽nݘ ޤ0g%N-/ѵbR08 +y8.7.K~@!mt įt?յ3\a +cW\H+ .ģ+d +B&,`Wԃ+d{7!pD:EwiA uG-9Qȕ11+ys +D9@Λ2]3Y? ,uB1L1W8;#~]z9NLÏcdz&TJL, 7Q>5f1ı"eTII8E h&!HiV$}bJs|31>bi̓\u RQzrR^NкW< . fwpmq~,vG96q:\|`L8d6d*>0#E|`)wVg=TF氶Hd%/<+QPAM}є2Qk u05_R/?^dnXan4;sM+˼L%1F G5Uř#D'kyN-^]aWqh8f8 O!س`* 4#Ԕ8ڞmTu,W0ןP-%y.Ϳfi2kI]X-V>yt͇մvV#}qa58ʼnhNƣOJhʞ!}_łBdjjN|W-Z:v7ZZX˻kescՍ"3Eܭ\ucȢ䢿VkU=X⼴UIS[*Ҕ3ZjS5V$ǵBf'8Ɏxt{#:G0Lh+x@vaGhvhwPs&E(ڝh8d+*%oVkT$W«Yy.Jּ8H[;Ld^Q*Ȑga7 r04A:}?^w~)TJD^Q<*2f}^WDl AUZDȕ2?*Q +." Nzrka|ׂDc8aDs0r0ơL4`3&C.6ء)4v,\wq;7` n*>~3nu.ֵޜIAO +!9sQw$5Y(Bi B{x}{k:A0A!ok\D;qj힍-X}6?`p;vlD78$D S5}~Ч ˖BzhvD0g>#sDlt@/gL(( Q=ɐ@D栾L0@=RI􏗥hԉu9U@^W1φ<J+uʀ:sʀe|N _ŽNkuoZV#.^;8>wYz>wA}`T8w<`8[|зe{N@w D&u%!"ç|2~.Ѣ_)Pkդ$v8*('QVP F@bUz>p"Ud)% M4 P]{D_edJ J'@JT2%Bp]D@r:-6櫷r]Ḓ(A[S><Thf9^4S}1DNtl a@D(Y7Ԛ(5)\.Nj!0-@k8``MƼX8,Csnhո&tzB nL Boό.;Njs%K4 jzv{4Eis >~\>v% -wwUP -<犁)v̴㚖ZG9_̴-J,&"'s>4HqZk=Ue~Eb"q"$׋ȸ6z!jW*`9YQ'ZmY3( })U{-^df򑍄xB9ʆ_.[U6U#ʓvby5r8\:Wa"T +i*"ZӔ7]MjrR~|_,9jpF[\-=q{WqYYz&.EvJ֏K$"2/FKdz&"RxsBDJoCDq|.ˈmDP.̋B$v%*6fU%fZMKڕt@n"*yK"f#&TR33un b.EJ2/̪/R`XD0!d"XE})-JUT3|P`\F" }e1ںDbB2TMahԦZ'i#~:VT #ᴄR5/8^?NJO~^n݃ʴe^]},KO 퓖ꗯ!xLPp@+2 ISRkӘQzlS=Xd&g͂Kql]ѶElOE&87sYlKgF_T:䘆Ca֥46Fk;ml9z+K1],h:&?kq֒Ofw s:wWVs_S}>?vH:!9iREz9Z:1l)ϏͽKO-NY!ϭ=w;كox槩YkwP:;i YsLg n̘yuB[@dIq "J3;:kv"->gf#4(JZ-A>PdʟiY.`U -y8ЪR{2(9׼62ݡ#¤)"e)ŕUF3"I7{xQ2,EPgpOVEЧl8?Pe5lEf pQR/8Fج,[A>eچdqQcGu G>ądE}k>Iaxd i;!q?I69)5U2X(k|q'.T.[d юx;@H>Qid `J'Dmy~+H͈F~-ؒE)4i0INVMLAf{DW1tT@LQD%@ + l"fGhz-+ XR+TsŦe# +E b +R +%>q uS2Uq,hI3Z!4Cev6 +MEF5E֧A+U%=? QMD 1놨7T%_JA{7]:/͵ZM#r蚃X_;͒x%,-%,f@,gx͒{w9 ^䞵p%,>xhEw^"<TS8H+Ec|Z,][9I[]Y\ơX˂C_7a3+X#VVMF + -(!bx(Cե0)d@3$l2TCyCf4%AT? QC9ԳlL"#2PR&=jj >ؕ}9BrqW!xRxOLZ=q +O2rdv! 5"Rۤxv +xK!@ +<=-A3D<-ArDt6KIv+T}dZ-:Dg{D8 z\mU*i);"zJi`ژݩhJD/XƱ58ޠm:>&5=KMcz]-|j ǚ#HyTSg||ya]WqsT9NQ={QW*є2Z-S,}PQB P+ahy{D]˔Ņ7sg9L8wZםv؟G.Ons.;{SY6ҳiZx +\Si[2 WF7i/i+De1$_^krAe'[؀{%c' ݮilK٦ nwIOѾq1 X5v7,F$>! e[^`oJ=&(PJqdރvzLѬ.#" *cŪQ 3`Z`DCgaXFL|`M h;S اN-I^.511zog&4؝T,,L70Q{!ZucC9~9}dPz粬+ENJ-͈:BFk +MރIJ' 4K,O# +M!F%קMq [-hnWEF9g c&3L?f}/qfAieFz袤TwsL +w\pN]gCR]޽ݜұR-ڬ^<',:CFOB120)(%NY f3:.[4Oog $;Rhmmqyv#> =DIZT';7|19thmCs\-ytf~l mlK; K^7%U[pN^|M'oD5m14Mc;Y7BdQSX"j{vRȲ0t#J(*{]#&JaWBADP.{D_GȜe)IhcH4 +"qR(@9LIhŐh$?^d# juA۱YpH36Ѡ߱[H(}cSGz(0M|%k=U8 2te!.W (TPDS_R*lIwW=<ިrc@3KG9>E}8yZJ)vwY0"wW?+1%sKε;@B, Jxm?9i> K +*ݛ{:+2;- h]ܙ +Hv.{{w/]Rt5@{I"8K#g}uq̌\)W\KMNqrq(. +ed1r~wٽ^J[-/K]AߞM~|P~컡cx|\tJwk7kN,uxq} +yYō{R=i,=)$+m'ew:e]Gd!W$YHOxuO劕̼%%șY ) #Z g1HUC;0hPF_-恞Ug3i)3m:vnLL;hT$xi6Ǭ8m?9&k:ux昽.afs ᔠS%h*ǔu gVJ!(^KWruѢ⸚MT&qjgpL>W᠍ њT/h?gv97~<CR;$u]9y$݃n}KbgKikXcK&z"f\Ͼ{4aDL[ZnGc|$|4=}n̟@_# f)JKJkzzU*U}fp;.lAqnƑ<?Ӽw0u6䑏h'sW#>8Lo<^!1>.\ztWcccm1qvne~1kD_G4fՄ5nqlcD=t:nċUęBE7rPM}F5&V"<8mho>77>'>-)!ϠO(IOV4r<}<|-FI|-AM8T&qZg`dC |RL`S q> XpXSeo+Ѳ>y.G" giI1b̗O} d4Hp "7- ! +1̄hŰu5!10(2pȦQY=(E9D=b>F4j#ڈ[ADѦ* )(`{u3'uJEBXPTF)zB%A8@K@a@ͦq)8B/8gqԫ|:T`FShoKUYpO)H6DUG˸Sh9C۶L-Z*D=dvxxSqIXi!Jւ8X>Ue#S h&!HiV4#)wߴ%'ϊ\gD18[cǗ|Ϲs7E|o^N Hd]g:(+3ݗ/o3uq8E4.OW@ڵ8<=m)myCP8! +uW8,%V>9Tg.R'p!\r{ܵ.mhr@Ur0mc}9z$2~}p^bjG߈S7Ưa@'+ydH`/!|&g:@j6IӜZT62'Ҹn|ƥv, q+[Ʌzxn<T$ #^9EOTaIzfos@۴(3)2rao5)a39-UQEjvr3̿Ǘ &N9'_nݚ׹ߦa ܭ}V귝tTtTtTweV>wNn񒹴]w$h-8DZxhj#(ަ1DU3o[&m +B.&[p6v||6ځ͏jl~LlB\07-|w"(G Hő"oqntL崨gL}->H:k0ӂ8d>[e#V k4؉, +g5[~ .><3~ە}dypvwc̭wsQ9..IAcw)`0Q)(4Ba' qjPS\4H1NՍiꢺE$՝W Z 8/"]AuSxF ъ(4R&0QV]QW +֨xmOdB.ð7u (!O, +|1F/ʕ;}X-&Zk6PѪ}q={AKQ9IMjon4_p{5'%<`y?$vzRSgSw-3kD:Y+sD=D;Dbj"cj:J%e3.Y6%f=#/ 0C[BO:)R5Z+UZrOuEan8zhm3O@&C_2xGyͭ1(knTzVzZh+2<ϾXWrx6< +O}v&w7.*<2^WCޘ(#2ߍy &A䱴t8u֗/U~0>/Z|!>mOMD-` :zBpr-zf{w#^n7]2㣲9/33IAc`?&p`3 =Lxً)rpa:4M8]f +J +J~_5rz +|Qe8#-}%M64r&8`҈Um;uɮK*`7D&dR1 ;XݞR9*ʢ'jQ{uD|-Fk5aLpվFPT577k~/ȷWp2<]­pR}S' _ |fqtݒr-)WvKʕݒRҥOxz%nI[R햔+%e얔lq4P {YV4=.y@bi2D,^Sؓ4k9U/\}-yEX2K{]۵(=mkE׶Eѵa]mߤM}zeߤ^xıZk&ʾI$BDS}Î~ˮ .c䫱3]z5d~ η/L;&qlwy}Jpw[.ǝz}KFNL"UɅ}ttw ,z޸9~+ߪN)pGtpmѻE٢OۡGnW.WOu[ݯnoب Zs²>{Po2`B'_dJcWՓz-R⵪ 4$u7KԧoUN NAMN>Nm[Dd~: VFC ZAh<`}{mg4(iSÒn,ȇ ^?\$s5|髼yjzs]艤8L%T!69"qrTCez2D:z/Cԣey"L G+o;Zl_zvܘ#M8>2O(y~b:^W=ZOz^טD B.8ᅽ; /OǻPqBaG;ޅjxIvOulqh}8f8G9M6`!&C%6X7YO(1eS#_󃎧 Nv.ۥU.ew4ᤲjUF:l1\H{x1no?F* 9%Bг?A2ג}属%V{P|ulʕ>{e<3mi* 5W|fy—n8Vq|FtLڍ8D=iImFFI-'[TjoQaKok`D;mKw$ײߢB o'U~L]Iy薖e\7"/Wt]WrQ#|!Я;e}<S}^Gi[K%, 2CQ#"YO#_tMDD`{$1(pY蓏^-EH[*m#0FFҭ6R4[FR"6%4K[xF^[I+1xX4l'ׯ!`WQLec葂|?0n\D[,#=P3;<њg#.ȷ~;c|x,֍+ + OQz HTٖim4=V%MO +kgxuP%'/F9krh9 i:^-Bk\糲4m-n5^1҃B +#C&+ x#"aW{[KdtT4DOјF^•ED&BC7gM}e)Ö:Y^ۗf}ʱtZזϓnPФʧA6eəxZ4D|O*|.ZǑXx 8C8g(TJh;*N)x4G*S{,|3%|ք1מ΅@yCDQEi5\q(JT~y1JfXFCVXm0ʯC"Tո㨯,_go gxp>leX=x+{xw 92;^&8x D /.1S/&)ԘV6MOE&Ρ/~l pdTBIk<>6&P)>0V }aPP3Laj }s)`"{KՙC4ϧv40{Wy刽E{spGBUݻzZ9pS N4fKK0ی]Մ$i`D +DyD21hJ4@h4#[; tDrN+Ҕi)6v~>,'ǵ,)UN]v!#m$qF˕m3QqCUZK.3ҊXR +TŦ# +oVn+ +R %uAО׺8_2見cF+5aLpFP T7hC槁+vQL2s:>'6}- 8>YY1i\Knyi B.ٝgɢbghc-}Df'Wȧr/.^o9nQ]\odnWNU=7; ҡ^/Ա{+L9]UۋV躧})9ڛtQVGcX+5GrSA<&0GgZ>% @vBV7aq}T>_w.6G.v|o'"M^fma*?Oڼ^ Oman!)Vn2'!hٖ'?ؕ +endstream +endobj +233 0 obj +<< +/Filter /FlateDecode +/Length 12571 +>> +stream +x}[,q{z6@yyXb#Cc_D#1fN;ӝ"qHbοۏϗY˥ѕӟO翞v2&Ou?}tɇ3?ğr/yx~O9T1sH¿u)G٘aNJP2[OU~+}R;?矍,8X9sRRbg<-b΃Kl f|]խmf- TAmUO;mm[MVۦ͞i߁K+'qGT52U|>ޥR VE*J_x1SG_9f5: +Ҿ,Gn"1oʬ| "ODj PZkQk7jnjk%V"B >͐o + uWjQW.۶*VMz-wTboG0ҎZj1.Z %q추L,L,ńwL웬eG{&RC,L,E&vMFwL1r~č&Je7Lc"=uľwAwmV'Ù<104dFX]ZP.qpѰM7-hQ nQjCp.7 Inn x]EDņ=kg¶Xo r^8kBZHB[ڌ6 + I$-6\B&nu)6\bnnuYv[(Ȯny] 1TjZyb[^bYYw,ƭ d6@ 0m6ˁ+8pkt :I5*">-[q=U*B(+8Q xBșFꂜd=lAbR]q9/f_]ЇiW?Fz.աiM9bz\NL$Ri>*KbweB^]t>nJuC(Izms ~_@9+n7p%Vv3\͖NF >'WϟA%\9/^#Z4bfR4 +N_bsHk}~iʴD.i<"-GEGqrBheOlքj&e_ {Rۉfjy{m/=]jsgsZTCd||i}^z%P|r)ǖAt\jEcBClLm ^EN3uL]熭:IrSlE/{Y:+={W?}"p_ԌpOhZECvASZ2=De4NzAT;#Zidug(|.BysGpx+q6΃Wzq/ͥG3T&&hޒ"Uؓ>r+䲏=cO.:@4Ef):H4Y'=Q.}&u䎈 t{F CDZADǔ7maFաITL_JRTRJSx\-MtViJWp^U.E 7AT9VT*ȞEi\n ZV67FT6ъ?h*$&z<}W>~P\ÕJѸD19ײs=\/#N]]~|s9R0F˱!c#U(_l|OȨ2zԐ&d-CFBFűc- +-CF T_ܷӕFMĠ@ g1]6C{*U `Oq/சY€PD1zFoDoDnFnDnD Z1z"؞e(} ڌhe1 ZV&7FT6ш?h*$t&:<]W.~Th#F1Dc#0=DЈQö>0b#>"F~ѻ] 6bDoD n"#v#bu1dm15.f) .~> +R$Q (5ۘ#bKOC\XJ4B!V@mR.ˌmFIVi)KDHKIKˁj-+R?CWEM#2eEK#2 +&5m +OV78 +D5%kfС?C C <#0xڇޅ^@$X|=ʓ<ȥ1pv`eAĺ~dDnSD~Kh  vHەouDbM;"q'oB$'nP &XiE l$Q 9"8zK17t.l;&C"90A3L$ fP/Q4L_R4=ޥ46/̦żt++ Tg`q6EJc{}Qj\HI7i .iao5:~:n؛~$>;MKy^Rz&!cCnS~fhOw|p!пz\xI9KbdDOoo[HK2j +ꪋ E}_pCo3)<,1GN8]7"w-䰦^ +ܒW%S"6Fk3=\/]W>Ι\y`v#kHj&]/0{Si|CaR*sq>nBu,.4zqC\ Cq_  '=0R*D[zl3ri +qFnp2,@g9׉XK ?p/&X +20MƄv+C',YXk% h&[k"+Uաuh.ӃXGAW[GԱEZc+AZyN| +b/ZbZyBet1WbڳQaoEU=k4 ̶Ks4*۝ZwRMkPlGX%뱂sSv @4+E "2:vTʟ҈x;qh92_)2b@N]ȩ7vmL Tz'_"; 9rЖ5FpAtDC2Q̴ֲD_ +XR]kǖ'4 "D&Q=a +S2($V5[F TR+hӳh*#Ӕ7Sg~|h0PW`xŏ& ;_9UVnҼ`}G6׻ 5&>|+_%\ֻٖ.Z&%u_<$De޻ ߻b^ aCme~%FnmⰥ(qZ9zom?zoCn[1zomi<(]+} hMFS#Q !>)c̫r!UDSĞ&"P +Ƙ\XlGqi)/Vl&O&*"}v:I:dC$Y$/&oN+6=rUA߭(Չ5[+46\?hot:G V4>*l_Ƈ{oAcЕC- z!d3LK&dmo0. 2g~3W@L lp4 K +u8R<їa5q4GSAIHo׍q:|T"5QLjT# \+t `CU`B4A`MTVL";ZQzɸ<=g4oH*8/=c=M2b\+9}h?6I(5rEDiu@?l/ &Q KM@aA3x7Axa$fLޙ  # C(ڍՉ&5h!4q; =i =ԩN~Plvƕz})o3?lg *#2 ̧axa 8`Q8&@`I U +y02hAb(\APL˸S-cї>'=j5VfZ{D$Ƃj)Q"Ʉh:dVNBȋJ `FkvEbyd$ƒP8<yT(`'|P +p( EMPvDV FSВh2Z!lmPyD[վU^|OTPSyPՠQ qy}94~j{.|x?CHZd[:4ݱ.av8[N2c %5 !ݑz<SxDl09ʒ$a{w/FJ%/i-cr{-W2SwKz_XU-t΃jwÌK^p260͹ڶJ8bBC9q%xUNm,ep+^%2-1 5(%҉_N^F1bxhdKѿyA4&0휋wv*JG[쇤:YLvV QY'I״1-]%*Ͳ2Ȅh:SMWJ>QT_Gc!>v4VKc6#fzw6Q$yqcT#PYy.", u%FF4&kNYDԞ.p/TASjtHUAd(OjGiw煅_t|M uVj 呑ĸC2 CדG孰 x) ;a+F"a$,} a 1g:NFcUK .{>7vfG a"!H5MǃSD텡 &Y="hi*A5T%h4G0YHUxŀ0&і1뀮Aq`+|%WRsX[k¸悮H0t,qlNkuK*/d Ս'kϮ{OAv.\9ΏYvkUz]\$yÎcgV}H֦/w? g >TJ$kv< Df@5ٷ@)dyG[~VWk/B}X1LP]a¿ +%&Tx1̀2 =C1Z +"^j>ϟ|8 <2Zﺣ镎Fx/y3J +Oq6o`=2uKDQm8h0A}GW0K#^Cm|$m$Q(Ά59 x"B 6ЂLhAZ{ +-( -(2B *aB jKblsU!Ҳ-xF4hނi.)i +1.em+qM1\z#c-G1.>Yԇ9KӸ ޅTC݅D4 ZjHGWUi"I8v Q.!*$B"*iB۩'y)\䀄^#HlKc[qrĶwm{_=D-[-}pK}RR7ZJx$#$(YhEMU3H d:LddCD!*C"f[wTucƧC%GȽyqmسM&cO )WN-~H$7L|w`H]nNx^(DW5;UhZGkD+=*h!wpz}kJPުT>*֥ry< Vb_y&=s$]l<,xȷ)ҋJY^StьI]VDy+1H!ޚA#^jO=& +#dH4,&aB0D J<-E[ +leD(lUPj#@aZ +ߚ(Uk#@T[E4>F[ĵuOoD;mL-X>{N2BQaM;mUއ'b-$gq!*??eSQ)2Q'N7Jۄ(mBTsƢ Q7&"mM!щ6j 1 QD܆(yR~ySs~3oy[E8M`ߘianlpbb2I '<Ƨ&==lGyq\݇q?ij>ݚ4Y^D94ޗDtkDdy uLxTdrF48FB}?P)8ѱEE觪IbR~uvlcB= lS )oTdZ)ҩlS5NrZlmm*nݦjئ"vhm*٦bnS$sD7QHˡ$Ah+hԳ`*t"Ӕ7jS5~|Xz<7jѲH#%_R-%ߍ<(U9uv}*RwO|_NْT-tF#΋a1^U-6ԡH}|j\[KF8egy^YfaES3ZޤfO 6t+]($v[DEl'!q] ԤuϭOhJ\溬f +K*؁.+d!.] +{˥3u?'CSYPG3!?OXhrTW49.39X,]).39S49X49^,GUSF6( l zZ^'gXuhXVrZiO0);[ߣ^ybU09c$e"_Raz]y~VUү)XYS:䌊^j80=97+KLW0A",18'1~͍>MhdoK04Ԭk.SRv+oMB8"R$1uTvimҚ߇wᵹ[mBݤJ!.}ruҪ$4>W E-NJp2{k9R3[[і`@c[c&Ǥ} 6[9&D6"mc[wrLmD6b;1Nt=?~ңb$f-H=b!hϜ7p%.(n.CdCD "&C"jqY*i#kɣ,5cczM2^yM2A ddr+$( u-5T5DŽ55DŽgю>d6L} tsLLeViCI35DŽj,?>>`Xd}_`ZYRدK{h({z~h<ʞnFFpi-uP]> +stream +x}],;n~6Z3s/ k$%USU}novN5[-Q% +UwzqKۏ__1-ҭyɵ-@nOחۿKXfOW.$usǗM? -T7FQp>+Xc._o)6mCk[q4^*C?uVԲjS(63T`Ri(e:PZp77)l3@K !e;X厕2ox7ZaEq]__`Jٶje]kV"hF (C\Y4{Hm{xټn wX42T˞Es_&{MavEuJPf3۾T3 nPݴ2]EbQZv}թUSkأG,+l|͂ u52DhsoZH_7qNq'xo _+񄗍؏]y߫w +귘nv+&XCC,:\@+S}jSkV`;C8Io3ĕ dxM Cbt{J̭&%fƆ!9 GbnH0푘L;$vC$ش +GbnH0H2N& -sb]1?ןZ#8堄%g]-}DG4} 0ii7vK֑ao_ m~k4h@V[5U(H}R7qCJjC1jCj3b p٘IcpXҶmm3fԙ x IYEl 175 2^L uiw=]Vy͜@tٴÎw0qcc{\Vk{\fujfurSI&\fN6N ׽1K&wέ״mml;I-muKmtK`KM6o_;Gcx0t|hBK̕n J&N ca|B$(1D.,$XJ67K#\`*d0,(P^JMUZR5"X7"EKY`B_RS 7 +00aRS}U.!U׋RK,@CL`1 1LS- AP%b (פ1:vL +qU~Bײp\U Y )@h#7 &"() pQ`yr ,h(+uTkM7el1Q`4lb[]pIIꘋi7k'>NI29j;k\q9xוqC~yG/ƛ$^kL_~}=//_{KA.u7<8iA׳a!<${}@ǿqW6SLj%%# 0X8 +r]C٠CbQ@\8[RE~In-H'1,08a`DE8pBId%(ۏDOy\$ؾ!A#CӐNDWȲ4e3pʊM'3P bV`)CRk qX~/SBt,HG/` ӂKhÏ9Zy$*D@#j%scʬBvy +Ld]d*%>_t^z^lh2iٱܧe}SN#;^V{}4y|,`*j + ` 2|78;~g&z ґ/q lb +êDt[0ov಻(WʧTD;daH ;pd fdߥi}*:D^b7/ȏy@"2 l 2bbo߀"pޟyXsw9%m%JYg%HK7Q4=#geyFݶt'KIxFJ3r2jJQC!^Z8'P1a&0KU@\*U&>i"@y9~ cXGkG ;Y&p2Z6\ڀ 񯥹?79TnѮr}bܨWvW^Hz^^:^>L$sv"߉5C{FSL~s^~ jR4x2C{n~V;iooնX>NddWdj~ }~˟"6gOljr<#y;ys@ng e ﭬVSrYd~8^]*IZHPyϽ[yϽ[+/1B+>Gs":D`xgĖ@I1%ȅ_8}^ﹼZ63wfšw- [9A*b^b gnoD*lzc 5 8~q$S]jV%_M ᯦J S]L^!!SF), M:Fs@m BQ I-]EX( +ZI"P$r mkbze>?ՂMKgOCxd-LAa[Z$3T-8NbGl1M`j@ n*c}|Iȉf}tm뫗b3{1/<ܺnx)!y#횽?g08ĸ(rgqvn`aMI"0#`W\*/_MZo)z}Yt/__ߚņv&|U"#sviNU E"7q}߹( +,rE"oC0w7yl'pDZNg \S# +]Rw9R*< XYiĂ~{ ìf۟v8ngS>o(AFMTM@D1p&.VL'"F5=M~2]1ק6`p.Uu[[M\` t}_s{u)eZ~@N^@wvpUgtj_qRANFvVNȐeFn1Z F~1ZN +L3#qd/Y.-ƞ1G6$8'M ~R嘸%b,' Ydj. (d%#O4m#4:=)О ',PN=ė{lF-6H(xspO (%Qb^Ǡ#}FN[yF G#?OFz9h +rm"k3gq23+씺qq1,a +o5+пv6 bcfDl^gDj8æ";}Wd7)i?Ȝ P4>cGXҳz|ң=ZԫazPKL`( O*P90RUfKW Nzz: ToE8(؝sN c'M?_f2cfY,ݱ o~6Aw ywQ= h>ړM~#k~R272ll%1FWkmOw|]l3mqٻ~-hQS|+~&@gb>|z` `fڥ1_r}w09twbx^tUOvp%3"2OE'3v c̬ɱ7=-9Aj2[Nr|i|/7zM5@><>_i,Ԙ8d!'0V6ݮ=;qPI^KʘE벝z:>um9Md~]ec6/Kӂ[ Z p}\ȯ-~> +nۏk%KimDnK7HmGmJ~}gk=Q6G!mBfO;<^* GwZE[e/ȫ&I9mtcSxs'wa>SxgS2ut'FcޱIμ>"+$MWten,vf l$$v݊.N֟a)裔#r/cz"^Pt%uLm,^Pox5I4s]FӑO<ɲ_\2pONSnzBA~|5' `D@h ߒ3ţ?9:>$cUcS>fuNJztlxah!'ڼ&VWy{.6Dpm|]Ͼ7=ϟ$eFME :[zAgut\zAgGwG+>fݧC"(\e䉻uߺ31@ 'iܰAtrXFX!N1#3>[o6D%4q$b'Чc ݡ[K6^C +Eߜbuԑt-r*%c3/p`[nVi}YSk/k))/%[7!ŗ?u[d"IQ;n LϚ &.K'"6'\.1(eEr+MaQvDY% [vlx)9LXz%Р޼.[Uo|_Ux,Ԝ}'esyT#R^m\'ĩp*bDáqx2,"}_#s^@Vv;LVg|+, +rc!(Vg&ZR(. ;d]g*׃&V[[ rTR]KS9vDž\S^_l0~$ dldqM ӃA21N]]?ۥ&q/kn}RNvm7]LӺZ슨b/aTmVЋ; HzɻL[(aᢅ2=ժVH LdduI2Aj_yr}c{c;!:aPrMj3 @=p~7ƭdX<'0{㝧@jf9"2Oȸ[h{LѪ`S2<)Ye ?"J!9W#=%S[͞)Ϟ;)[=2@[EsezR^zC/5C/_^;^bdlvJukJq7^O;>?'w(+xVҴ{^O}Nk[it`**ccjsXc,c\X1ܬXXW8X%ɓ|/ʼ2+M5]y7b.pQQ\,3Gf5v;L+gtbe`^>{!VN+}%K]>ʝibN>rxKk6 )}qյӬ痆*e*TKHT_){a 7Ow;`ZPj`ҪدЪdՄ~'k=><z6֣T-ӗ &jVEE,F_I)goAqBڲ'@6CL`R5~:MU $"Jx '2 TuƉ)_'d|-  ZU6(oo/HrXJ/~6+ܼKqP 툎%[=Kha=oJhac_ -lSbO/^zC/3C/\cd/E/}*^I{ uj%׾]\2Tۂ9Oi+aӊӸ3$ۛQGDWN +Ҫz$zq0Aj@5Үt]X7JI"]I9$[f1)w܁`ul|ͮ56V5XbL&Ui +WMV5Xɪ+ʎ! +mƸ`Vշ*{^ćM7~ޫS,Oa> +stream +x]_km8rHlLڇH@>ME17A/HJ:=ǞE sLIERc-}/_8kB^CZSDH闿/85 +7{M`Ģ/_kI)/χ~ÿo/ˏ?,a`ɀK/\/?^>8X"Ģr"vÍ7cW}!U\PVJ5@BkB@(|9 RjZkbj#1%Z0!hɗ6Ry͕YsEHFcHeAnh1˷q\cr"'Rڂ/=گr+pu\\FX!U1VP1SU(B&Rl!dZ:&j#hZddqq1J-4}nW E(ĘV&& "7F5d/pJ:M5B-*&x{3+L-98nn83iRt o_7/|C?_Ypz*|#7JgJW ++t^ `pOhLJ]B/ +v _B@8kU|ɣ/ldpqsv7:s Y! CxCt}8PjSJ uT=W|_9+5|ELh1a r,W&K5 Xiro h2.ɼ6OU4m'!~2@%:c3`*AqƟj6PWV7 + x8n?CIDQA:2^y(PC2<M%:4!VdMh]@&22CTE6< E:0Ǫs4{,hj2 mB(0sBDf]"ЮYȬK~:275{}B^v0ǽO2/Îx]327L5m6~"7݄v3pt17ݘqV2gCݒ&GNi +v“86T>:MtrO t/?@z!dCഢ6:Yp>4lXWu2HP֐B V$$5#J^CyhӗFk̝ ;фkA)c5gO8 kbڣ8 F[K}"5Ce٘H&ʕ]?$^eaC=XY܆ 5Sײh4ta&iƦ?\7EQ^1?=ڸ[j[·-Qy)uLgTӫIQpK9˿ƹk?e2w:f8nt~8>wqbw}?mI D;+uO[\ymn9hw ;ϵ cOtyu|P5H4wmzk}mAyPߦ^ѭ %ʘzT,c<=CmpG9UÏc-juWuf`D1ѿx|03xyDZ+e33oS.5<3xkr\oN߇PsNCZo/qb81Y,s5YU9 +݈.ZX@ 9 hslslad(w"T"1l3NnlSč6%P._ccQzw[F6Zm]~ӟ" JL>RsrH*x:kBSdKpܧP E-l1Ic;cŋ[# @6JrC"QxjϻY +Uo,'-b>G:Bޒ&,S#i5F\6d)&L6@8 "ڏ|3@$B^k | MT=21I"\~SˌuY#/kHWFBB\L-6ވM"6!L>iV 7Unś XIwcB| oC'C3طi:Q-pXyx4@U-yǤ&#yǤQ/ ْwL`DKIN"i(IJJTݸْw=i"4K1kvUSBCiLˁKˣDr|hdrT I̵)Tp D Qpb,TF'P19! +-ʐP+FsWҬc%d*:aza]5N h->&X9X%::1IbN)X;Il4ʆbR] +5&Y0ͅ4k:i\ݜ&m4OЅ4MdbC56 vkx1;.%nSq+s1;vQgsBۭCj+wiϯɾ->mwn쎭*Ba{gnyHK3+wJOc1z랻u{5Xuwĵ#~͑GBDtSX+P0QmÝ;,i(۾BROc]jDV^+afӶiQ'`Z>~SoUel)K0w9W/דg4|mI?(e[6(6J$$)&hURU_lY1&?} X{MZ +e䄦дh%&srx! +]5Cea*=O5(Ė=XX +eRT&W/=EwYōN!JkxWd{T_x{3'K+z9YѷsOT^lM?-ǭTr%Ҥ%yy.}wE˭ӴksJu񳡿gMhG?_XFmJ3Mjv{~J_oDa-Cn+=FnVcqb+u~aoOJ`sۖ#($rRz+K#[=k쩐ٯUhjVՕ-#)E"֥hVVL6zPRNPR#bDKgETj8&m!&EuOK@gtBNE +\ Qf\61hiJ c26h3ԨsaJ'a YRE + jEX8ֿZ鞧Cۗ +H}W+mTVP$,JZ n@ʒQ!J5^uF{z?_tӨ3m4e蘭}4~o6eYN!toC=de? #`ԁh{KާҽoG޹2 po{w/npT +l2Gڿ_amਤcz`T7C@uҶ:Es0GzK(˼W4qmS_-*[f胮Ժ9?QK6hx|=CA[vv/uN}Nf,iRhU?-[6cTh\G"堇dd&E1!*nd~:Nyﷻ˃7]_')o!cIky +xq_46^w~yC'eX yжV XƑ !ׇeLC:bټI=+4s;{!$ Fș:g Nt{*A>f6mGٴkS⿱d]0^pTvM(V+.Tq^Fiݔz6d?7 9ĩ4#, r)ynR\ztA$Vl5wtg!0CZMCJG!:ؾ$>pq]qZv%W v~YO̐Yym_ i%)P%{*87ʷA `z\o[/&i<FH|۠%:8r˔GO˔dSr˔@0Jzcn1kit;creO2t&;L7񽦛2U8?`nnzh}tӣ{ՙlwutmս|ۗ2`w8SoXlۆ=Mz[t\[to9G|_ o1iki4m!o:?h*- O; &w?Rq zZ[f]ѻ<%@^-fBP:<};hkǔwq . &)bDgL=K 0|oW8,G"zs#|{򸾍r{ ($6ygpR%^ׁ嫖>W<>WL>dK 4[rwuaf~4fL<'ܝӻs +N]?<>ȱ>TVZ|^kGOy uqUj@uZ=i8Ǻf+a[ֳ̠֢ +^tPhߝ]er_9j*7΋di6WyYNSlkiMS|d]Ll4'?cd]ŸTVw $Vm!njj?QǷ$:wᴍ7靎' ~*_,0>W|TM]l9>)s%RWV,!e;4G?1Ij,3:cnA'j?D5,\z[uP DO!f㐞jd)~lǶ4 S(S&E> w(nsV&;u"wc6`vFh2cojwb<ƮA=f0ؽ m ҷ=,wL? 4:xAv"xuӁiV4+c2WiYNSl4'c4kp>Bd5]gSl)r sﯗEXst8|/A +endstream +endobj +236 0 obj +<< +/Filter /FlateDecode +/Length 9368 +>> +stream +x}َ$ɑ{~E> dVU.@`$Hj) vEVuFvB TWUv]2p-_tSJgKj[3 4O_>l)#&W?gFGju9?~r9_ow/ _~2t]! [m33l R`}8`jC`qrʰ!:A6lu*k眶,SU"EO>34!rΙՊ +Lom,rιЃ*Y94.7,inPgh`X@[z 2F0_8%qz`Q!bn0H6{;U`bYgA>1$KqE?AViՂMlf!05a3(lB[)"SJ>C+"up{# =ZԡraiD Z)0B K1WFvv '}{[vG$w2!t~?'-vK}ӬF]5͆Yp7z8̓ˍ0|D;d)2=ڋ|GFFD^soY"b(ne τYzs<^y* f*3i\'3i)_ڧ3GGq`\/O5tҷ!Ztߐ>5e*i&=WvϩϭT,+dN +F.:(- S[%Spo:ܑ~nܺBriu{\r*s5KO_Y yKn!R;45) pF)ӱ"yy"Wglfj8San_YD[C^]SR_[k[/L;E<졕C귣Ɔq)mJ f,a]!VAXsãVԏc D8c xjOʜ|/щrG==.oaX)9~/3m D'5X\sۼk :{,y3?˼:bXtYa= +<cV7cUGfX'xI̷,bˊ"G|},+FC>`E'>6o%c9-NT>c._}ooo[n/ٟn!:!~BHܩ ϧ\ +_,ka\~z_ +e xiإZ'jnS}!Ex1^<"0$6 !.¬h!Cf i2bM5ҕ +Q4+^E)8rݪD8wMt_cPvyn߮޴zJsn88 ʘ`Nϩ^ -,mp-Рkd +uuGATmjDaZ\fN(NNj?\7#//j`RE/lZQDVLcԁQOyl;6Xz|6wBxɟQh'JIgbQ +k`mV0[VrMW/[v7ZÕbcĄt݌h #iMwϾ{^2WW3wv8-w|r\nO>w;'cxF&!`"T+:nPnL.Oɫp8K.i:\f`rO`1S0BA01S0B@5SPWpٽRm=dr"e]=PJu6j@03̕:Z`TT6w,0q-oWI*fc9Iem;gYulr8;}MCLGBٹl][d" ںwPE.O;>GwcMkƹcXЎw`8ډ!s'^ ;Q4h$85AgT +ӏuMp% x@g%C$-bUI$菝]fn Xoj޾U ӏX y&v k]|ڻ)sde^{ js) .Ѩ^JldRX#V/;VLA V-}ASZ[KLڲvLHbVv1 wq,v2Ɓ0~%NPR{%`LE,^3L¡N7=kQ3]e{e"U[P B{&̺Or 6`_iw,;O+xvc9Ѯ5g6_f&:B!o. j^7B޲9X4%"ǁ?@qm@9M_Yڜ+|"%m>|ZG#AW6' "ބE=$ŗS(}ENk[;ey+KJvG M$Hnr","[ Gp,QqF +؎脉t~5i[:Hruiԕ*1`>o1d5dž{rW a!m񸲳6TM7|A +a6X&hF~4vb]CT#lJz0h4U]9RŔ"7&m>ҢA?\+`=mO6Q4Qc(Z}mDeY ҪE^4?m{ |O7[Ѽ3mһ8@ľmKAK%dwA%fN A֊sed k /l<LP-ۃ"J%c>Oԅ +KE{$&}lӤ!w QH0-t&:8aQ0$Wn9v}yQ$8Oq=[ [Pɞ5<@0#(q@%׳w"i o#78wlkڱN M;1|LP<vkt!qG{2)X-טbp5bepAҘUs`?G~0QzK𐾿&C!V›nQ/R$AIW-ۗ1 T)owL]{8;ALbNcm!r֣5^!ӂ nI}+X08.WUkf\2̔` *EXۛhZQ(@tmS|h!̃S.cT'}&t.V9Crּⅉ"#ě+&^2B^{nBC`daфK VM4[ƖG#s ARRܓX^FovY_l{ d!Y:j`w+l{ {ÖLN|!~ǰ\{ǰMƍ-L|pr}Vgp}4 "!yA|ŇV9w4ZUϧGqIqՓk/ q6خ=A9ǃgU,q6j՗#gQN'㝠E +"I>9[!*끑ɺdw+I70DMt"}qC@ƀCyneHr ! M>r@[|A +cZYGP1鮛8)4?"3Y "Z1kmufެہh!)r=]GƴAFDV_2a(cBXhRt4~s(~.o1*N!&Di+hm')y`ꄭQ#>^5.piُGfp-O5mqSX$q6U,mRQ| y_qи,wc;R5wcu)ʫFi'*{?&D8F?fU]3 +D{Np|Ο ^oK^JuRsY^hWü88*h-G)tDy52d?JQ-y^hM#ȩ׏=wBfWnc!5U[^P8-${6 +j8j^u^~}j3@uVSz |D+:κ TB@ƨ Fl"eV'Z=iFɷD>:-PrI,4YuHk7[Mz;Mdhbթ5@>V='hٳ0Ն`ۋ) }S#O{7 +9=h$&ѭ~%OM3Į]1s1g4Xď)FSݮ=#]LFҙBb]DwGN'#Xȃ6ȫ6kґ =QN AQ.Q@|.OS؏.YA +J=ip|={/A]7kpƱN#EjN 6~6 Ma'lv i~ѿ лO06 >aC0:IS%0VY tO, %\AbyelaTWH19lI1ЪxG`@6+2X]b47z(A+#}*0֬2L5 (h}Uqtѩm]Òպ%#M[Wiކ|ۆmփpuLd`M5(%;(c Q@Aj&Oӷ#\,5K% -ը~*ԃ~W?~R"iQoH#V8˹%sEQbvk;"QX<ׄ=as,`f }V]ɪ +O*ߖqC?rڈCjvM;ZƴtԯP=G*cnbZuk+Тl;0Jרk2Oì:5* tMPi@6Wiӣ;6G#xV }]X;.#A ֒f-NABq-zq>Y}ՠlI\zӍq|GG JܳC?Jq6ۈEvʁN= +ԓzH^[L9OjgQ3ήZjYV;qʡWM5ޜd}wtep0a+$ u(yL{+;Sybg Q5^52cT\jOZ4ɋ}'-0¼0䶙b2GCN=mQlڑI.10+4w-Uc`W׌b "z1 TA+.[vG +8?[d>#+m_牽S9rmPH,kqmg  w>O ;Wo p՚QЪjᴨ־*őժİ+\J_^`t=oOqygKlfqv;(& +3]xpՕ9 +'&|*lbt<=ms0!*jw_=$n;&\XKqWDJ +IMW?RQSs0=||^+zYӬd +LC; :EMci&}"amPFKq +,TJsLJ/3|`jt:'6<İ|Li9C_f[CM<2vo_X32q9; +y< {ۆ-](һeU+C~O,GՆK֣jCT.GՆ1R: s1%),JFS"ԭw. +)U +#W+Lҋ3b`w`Ce`WL`0  * T A4*B;gh> +/CIDToGIDMap /Identity +/Encoding << +/Differences [0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 +/g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /g0 /gF4C] +/Type /Encoding +>> +/FirstChar 0 +/FontBBox [134 287 2460 -1517] +/FontDescriptor 2477 0 R +/FontMatrix [0.00048828125 0 0 -0.00048828125 0 0] +/LastChar 91 +/Resources << +/XObject << +/XgF4C 2478 0 R +>> +>> +/Subtype /Type3 +/ToUnicode 2479 0 R +/Type /Font +/Widths [1322 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 2812] +>> +endobj +238 0 obj +<< +/BaseFont /HAAAAA+Consolas-Bold +/DescendantFonts [2480 0 R] +/Encoding /Identity-H +/Subtype /Type0 +/ToUnicode 2481 0 R +/Type /Font +>> +endobj +239 0 obj +<< +/Filter /FlateDecode +/Length 6713 +>> +stream +x][$m~_\DQ L΃8YslKQUU36N7jWQBW(K"0-H?\~O?_z [o!?]t_]p_~5]<BpM]Qe)v<ç_NwT8\)+-bkơ5fK_w zutWz'z +:t|^*5+ !\\avM\WmG(s*w@oƼk65͘"0?@\o7Pl*D[YlZ)&YlMd֘v縉ZU*ٖYB'-1 1cP1TnM=QSYUBvֹiVu5fYgf4Ng v|SYTe%BWc!p)Y1JXL9\?_IE]`biGWYb(P˸pL)*JeE[)b )_BoRe+m)ߟ/>¦m,Xh`TaEe1L +B:jBQ,X1 +WhY\rNڢSUW[XJXp8\#w -@WH%2BM`]8%,eb K,(KXR6SL K.+AykUlj>^Zj_+Fiy6r;IwUVsvu'|Ͼ*{|v4fw +,+ +Ŕ!ĸ49b(g9^+ +"`r69wGY `Yc.;vN=6N'Rv3,JC+T1Xb5\+I1 zW,|^Tb}^\+|'֧GC?ndgFgg֎kC>OG9;q.:t]R{B578'WT*pz~"W!@ w{}~m^᜽œ]8V 8sܴkyP92^=} +i)&+)+#} +eFz^э+z}м^& ׏׻ ^Q;8/rt$iƹ_wCGdL9U^%.Kbh/!l^+z zŶ^z2{~vz}naS 8p:_Bq>e眯 yCΙ%3,xM~lŬxWd>Sڹb[Wln +nIsџs{7Ajǵ!&MΝ 8\~AùuǞ0}x5֥fˏ @[G\2[/#fİތFE\^ >'Ϩ*`h񭽓z=EB u:Î5cvf ַC Wqp6Vcb))^(W@U% o pQӒ~ ff;eRsdoxƏ2 + :F\3@X $۩|PchCh?]SNP;> +禸,O$g0K>e:L씙}$:Wfl\'ȷU I&ePV TŶ1Hm5SkEu! +|]0ZO'[z6r1) ؀mvpb w[Mr& dwF汖|S|{ mo0d٦51?04OA64aB_#ʭM/gH/0G@K E+pCy?ˡc$NEMbړД?HX]_~Ƃ#aL%i,$͛bG̨)C5"BeɚlҎb.XQ.ICXR ˌY*F$lVJ䊂~[9 ߾F K(+1W(brXRxQQFfGB9Tu8 )O*5$9(PrSL +ZBiİU~_] +&@@ѨNAWNjb9:hGJ[1P-ZtgMdi7S>^)dF͸ ę9s!գVi;jqڵ7\Ny8-8e7CIX&%eF[?D!ZĞu?g-SOlsԅ A0[NI$|lOa]T1;?_ؤh[QNH0$ML%o?P!|%ײBg[zd@,Y!qg+JYB` j+f\$'LW$KJꭘB.5W̲tfBum| iAVБqxu=#-kG $) d1ܾڐ. 3uHZD=9h(Hsme/I[O *b r:Sȩr)}sg-:-#uZf:ǂz"e $^'/ss]΃[TG[MyH^BNe<5`3rpc1s_*#TF}R8yc۩ms=FГKs7}puV-wܻrQ3E!u'Alee!B-ǑZ aZ;he%-ey@5RK}ט,Vخ@BmNbQTL#I[}*[6F5*c}Zh[7:5 aSQ%GbOˎ "]cE (qBTLuk䭨:j kE]DM׋ob!!K/9s݀9V8}Kyp{?/E.ue*U3\bxnj܊'cM'}N&ﭱ:mh2&lH~Ǯs.iSK0di~Ah kk=8r=T;[q]w&&Zr[CuM 6 +ֽQK0̰cEoQ`zWc7KOụͬʋ{1`= aGCxje/l{'G'ҚZwr8IKmV.nK깅a,HWLҦԖ6{:&ThKqBc= +QuVbOT#HY[hjW'0uڦgڳEJ~DE5^9RcX jv~hD5G X&a+l29S bK}UJsSb֐{hZx֐QL  i"/,I-hyJji $U*Ĵ\l.?VQۛXav*wv{BZ]һؐšMݵza[5䞕jvFQ Z`|J.z9 )`\Z0yoýNwOߜ%9Y-'WF]S +蓲 fI'xa6wA]_Vm..)ؔr\BtĥNkup*rzhiIrNSfZO`^$B>-]J}`U'eUJ𕹭\I{.gJ )ɷcqYcyLsbΥN<[9Ӛ +Y9i띿Ng.wEt#ytf >#,u䬗Zq#_t}֐]<<^+9IȴZ%mK?D,KAk3Z+ɏ-Z^aUzZO9Iif!vWnʐ6A2ۺ\c7  +Sd$msFb[sj6,``MlؖCӥx$5.&+\ۜ{*Q֔`:*\FRcerw +A}| T^_vd~jU@@\,yRQ +GbhpJ%ǰZӔl-+9!*ERyjưn: ?_꣥}Kȗ:t0oCk6x(5y{(q:r^>1ʬQgkjP{\N{1Mrխe7t2db;v&_yܡir.Ɇ':2? [|Mz$gUr/k8R:][vv3%|MgI!-9Axs:H! 7|f 9Mg 3rcEp| zMK $knc]T>ZjD#0^&*w8*44:44WNGA`og/f3 PmΊ8mݵӭĦ_T,ۢjحFҷ/omYmnhE|4"pGy98Cos;5Lg i +a? +qw̍jXWZa>NPKM?C8w8BE_:)E7JPϵ+?V2wJ $C~P_#Y|R> +stream +x}ێ,9n{~E<h$ + *>؀=Q=<ujS,E.QRR7f1&r &a) ԧ_x׿rϋ|V[#fdz^ɇ4-?_~{7.?_/?c=I >p`8D0sH4ȉ|O +r8L.!*Tk˘ +o}Èo98TZByn"dW`\ԷI seĉ63l%}i yK.@!LaC3 P#L43Ea2/fWߖ$C +R[$*R72Z*`b`ΰܮt]S! &S00!ʴ їj Ѱ7d3tȰ2'FMO?9&rN-?^iK8|mƆ1Siz9 dc[vl-e +ZTi +v`z"~''=/{sn7>?dE3['(hR nӪ I5ڢCjbSe!,)dHkftf:(آv PT_ +K\= _hUƘuѬ ;=2Bm @dCUV_5VւlI벙/eCxC}]ꦶ7|'lVh}O( W4[LldOs Hĵ,iIN2leFHdOd/<({zad/0dOa9wIIgOt,&0ݙfr>3Qy&2l6YIrRɞzq 7k;:V䖩ޤz +cOh0J8xMЦz +dmU jer5ӧEڙDc3h`hji3f;J:=~ër1٥̸y߱dl^\y!l{ؼ6{66+lc +\ۼN룵ylc1*h3 3J` Jg1Jh܂{KeJv4}qOg9Ԝads4wlevmvE[Uh-4VzV V[HZ![o̱vҘ,jO5XmU~=u0HNwqrHP\r +s[H\e>c|8pn[GAgxAEa| {󜁹`s`{.By~䚼@ʅ_:#I&f) i&͎Uy|^aҪ~BĜ_ D!Ďf#&va d:o?%Bt+,b ~/ 3[@.<{C*cDǝ_,ƛBM~T!D0?T|bJ&Kte$rRX|匪2A>.%eo=<5}eOiï{:gfkN"J +lF/joї%NA$?d3NwIBL/ЃXhFZafx%Kˎ80s_IU:uɱKN(ttr Ȝ$MfǏ 5IYmIOEHvK4Mqu/D1ab_560E&Dnh?GkJ\fDT $;4K$QQG쎵ce>ء*tZPmX)w9A[(ԱB/P(C ++GIN/T^f.V͖wfW `1B^RQ8܎`C!"lPM9O +Q#vĎ*td +KD_c%ޞ QȽ_ +k$0ę[+S-tr~ɝ@AhNw x?O_!x{݈ 6_[J98lHq͂_ڤ~&x0Ҡ i~1kR:ץه7òsui.@ 8zHu8C{wEF 7O0ȭgÕb DR{h*mt{Z'7u!ۃwTm5=ԑUcM:nc-qc 4;ucJ#a#Yrc.b`N5;6?P_IPy.) U7 aej*n"*U.a yOT)P,VjCeRKS2.2PZ +|Z@K 6G j aK4ҨMZ\dCu=3 (3Qh.*PkD +X>d`)+!b՘pi*8uE-ߵN#i1(8IKHN, 3`9RL]KK(wJhbT>50Z}[lTZnñ>Fn̢ZOcvkM@p }Q .3%y6c‘$D#̯M<}d[ꃖ9jYdQ/];D0c؆#iYQGlh*^3@39 _{Bnv4;7Rq=^߮CAX":6!jH%eH%MHU:d!UMHMYHMiRSچԔԔ EH %qy}%q +wn]7b3ajHf)}I~1r-SRѩ.҂)S#rKH%?nȰJC(a+[ӷcA,ZG9>*,%q!&,* gW>-gkf#3ze5 4bt (㍵CkM\}65;a$H-tp6"P$"litH:XHpx"N}@"JYm/opoϱ)&i_|׹'C(AHaҚPJ#FfT[ڎ(*T#s +Uޑ*.[p$@ݴHxc=mZ3tstve; G$Cag33P ?P5CVpw(Ph0 ,6?:2D"b} ?.P#むЃ5pTqy#Y[C +"=X+\c!Ӳ1uKxKx'Kx'KxKx/]sscZBPٝwm%Cҟ#m?+q)c![=Y26Ã0*kꢊ&(JKx&(B:+DhH{|FBǫ i'[a%:P`%ݹJ%e[ +'}J +4g z^X#K(V6VAR`5!Ѫ̹ +Qi>ôh0?~c +QD|Xt`FC:1Г}M3GmsQmİ[-Atb)q~?.L5Hjc 3|%{scŮ=#1b,c4+|ƣr9S>-~*粹<}\zp)PCc5mhugujƛa5ֺv{mlvEɎwNgNveT) LćN-ŋ%IaaEʲ^@ҳoI C+e->;7=~0!RNOհL:2/xtW.\8َu:Ed<L'd#yA˗i|ІA͇Cmnc3T۷1iCe71!̨/i.p&kČTrS|fsv 2EjݯU)㪍 nt6Vqʈ@ƨl28"[|k]yc=8q孬+Ӹ0 5!}j,%fեG+~֕uoJ֛9-N}'  E+E=^ s oʅ[Y;(f-| +K o=l?\Ó:@q08'Tku@OBe' ++" )lAZ.ZȰEhMnz}S1{P۲,=Rߎ9 +;S:{: I6?uB8 |>;P_0sbsZw\U /Wo.N8R__8U1YN8SN>d:kz"/HщaSBJca7 &H1~6!CUbC(~AP?{8gusl!=Bb*-Fjg@oqWN_j>=ǨI+'KqV"DF/cݽ=N$M|p2s1:{A`7?{zm }{cz{8E"nl _4!"m?oOZV%nx6(vU®t2úb!8B{dB]i'mbv|1$6;^"rn?|^mx&(P8byCx=1ya%޵Y&e# bsʏŃ]:v_Me_W@9oz{пR!-c K}E-{oaOR~OR(,G^ou1Oc)QUXKmR`KU΅Ev_p"_4I[ojscvD}߫jTpS`ǁ>ݲf +n;k;wXkv˼C%E×mC1^4Mb4oKqKto-EZj7-XVvfμ]زn"лHC*qi_7deC[]/i*Hmg7٨:܆c}EcҰKke {Zmd/*bX2rV1Z^#rym[K64?!Z\*S;-C9뢅=p*1<-H\]!4+⃣(>0j_fŚRO[{ JzQo0V)鷕7+)=4<4Yj!:|eAa^:LZe&wQl[[Мk,PAA0^L] Xb CcxM*=DzNWטݿU{'Ee"x'HIs=Y?S +Y*WnDxa*5=f7p:Q5s/Ɖk9nߨki1AEQ\v'vTi0͙SBv&lCvb?nmzyylfL1[D]A]wzn8sr ݝ<' 7vOm"Zqoy!Ru{J +endstream +endobj +241 0 obj +<< +/Filter /FlateDecode +/Length 7682 +>> +stream +x][o,9n~_Qn$0X! dA Hg 9v5(^D^1Xo?_B^ ZqP/_-%fOf0ҷ/+‹X_t__e/ QMiyTcMV]Rš#EhĔWHJ)S4JF7}71hIi)\*JHFX k1FK,oJ2Zm^!An%ݥZ=|`#]0p.rh%[-RKش'bPg֜JIza 5䊛"K꤂fT'=5BJ6rFX8Xu= @0*ek*Dk)(TLij7LqZz-{-T`n$ZBC7hbM,NL`-vCv"AZ朑Ɯ18w]u2iϹsͮCmojBxu䭯+e }]iO3J{u|]"<%,ehOGii'Ӧ}OL/R=e^wcSLO6:cX>,1%,>HV6R˜ễS+\b+,neW&H>0j͞] Ɩc˚'?WZ\1¾R!*AWZJ% +*4aW*]Bү1C/o #VmR5) b%bjJU3]nF_6+7IXφd|mHĆU(a/M)^b̀N&#%ؖR&3bfx=RM1cyľɜvanKyobD;Mg+c=vLԺcbdg+I7m)eB=3-fC &J s[ʘanmg4D_;&0uD{fbdJhσfe+RSRgU5:"'u?4^| tXWqy~גJ +LPy)G% Id(J(5QFtJ+b$2KאdVlmIX7T[\ Kc,yٷЊ!>qZrʾkXI].}ݨS~o(3( ƴZ$.0BYkc3Io.I{LOldͳ35<0;#{ AZf3'hNOqq&h}}G.Ma %%^~#DOqy5Ú3@^gZl3n!7!bfT|\y +?U 9+yr}9ۡSHPX~X(]iSXI.85E#L7V&pw^X,B?KoLAJjr!şOfw,?wLSq1u 4qDS?\ C7 +G++ERHw-M^nnU?snھ& +_=\~xYHhRA RnB۾ +ߩ9&Hhj6%Nkʰ^8Zw/nEOësY8SUg{$%KƮ")LyZ   %3a j$٨0i-2ҨRL5J]֐Q3-Q+(FCY߮+L70,Ե{{DRMȵV#J0!MB:XEP6jщEh%0'>H):(IuEGŕdV+G6!n.C>beoq +BZPLA +H\hB6uyqS+I>$ +Ƿ3^̨Yk芳liCZ?e9s:qy쳰\N|Q<w_n 8rW!gez(s/'>1_dqzdnu$>)\V`ؗ'[ c!L~L +c%+&s,ư{*,XԳ}V's?JSlɸꮖS*T'S=OqLc|*P3o3S'¹df4W8yb)[᳑G3N*',nb=V8p: œؓncvG}ǐOn mZ1]НY7Cy;Xˎ rLJȞxjn|x[z?n@95BWܷIh<+BL+\_%$tfҽiQY>ZxV95\oP43Py rVRU~f' KOh +9 UPF)DiO\LJ1m]|k_cѶ9[%U1Ⱦ7%V`G5{ 4 y)hk?!&KTÞ +z9z+zk=v==K{Js)n{]1G7pORy,8B9HB>juI +M7O.#ˤGPܓ+~Ѝx-n sSj5&B}}(@ EVt^!ҧ14|9_VA#XFY^,CSg+|J UP_|\ +5_E"Nԁ +5-0M 6"SAQ H0G:Fl*c\44!hlĎ]F8k6bENREpdt6eӦnٱ'4zD;. Up#ɚ&17ꈎM7J{)Y^)/Ykٺk58o[Pz 블B|]o*5 wvMd4!7'״cD5;,YRh7ec/m67vXlƺg7Х.F^SOlWp/N9V@u;D]$׳89MJ\mғᴅUYE4 2Ob?-k +r/YDj'Q[>HٌrNGN[VJHJ%HpԞώ=}3$B*3ib' > *)SNOyiK0ExtKP Pz|R)3y)g'e$Z^5h5[>, +ep2} x-TTwSO9+.ikI@SCN̓g P0mzHo:D>OvDx!mCeIFSrxpRbxO[89j[z<T|ȥ9z+Mq]Em,]]x ^J $YM˖=#{X,^}!ͫsA+ǓoSӌD=!; Tpz H{5~LhcWc^Fx=/Y7lk1*ԳNS)7_+ޫ|HcSTG,cpHv>ϸéSF\_?Ix(UM=֘]OΊxUi9}Eǿ=O.=E 5~)``XVJ6 @@rﲐ?hitymPę x<%Өص *);fwC%G cIv߀4eZR@iZ-/B l7NIrThz FvwB2Z:Khwl!*MEvM5aQ9z`A,ʎ9!jF]/$̛ Y򴁜l (DFBd )F: QMoMь-m+oö7hnh;7?7{@o0 烽r]ZԬ]\LY-H+̨m6--w.;]Ǧн7vxU瓃 hZU\tkW e(fjwa@I̺Cz{#}3]hSL+pvly,qbE\S[#>[} qb7qp=*ΓyN M'@]3gKXT}Jm^ M-qT R.Ɋpyi ӄS:µ/n)ڎWM|Tƶx=IdLsHP5AJPIh:HrkHM:e}.Lm3+PiBݍF`, T!<͑Qo$y|~Rlo&m.q!צ\`'DA3qqqV,vՔ +)Di$ƍܣP˦' )m<࿩[MWPǝ={rM.c;^Cx4=miZqQp0.wܲo}"A83nM{Ha N`jp&4C@O *9H5HK&7n.ܝ#b9 pnhpC2p4D4]0l;nuC#\}d+Y1 EɛR8)zQj4oM]42 vL{-s<}xèo%Gp/9{bWc)]7^Yͨok`芳liCV x2*=vv9EF| g?Ǻ$ cYRJSdD\he)gϧ_<[u-t%d,SDj+K#/O?z +ڊTw6 k)b-li%0`*ϭu{륅`_!}+g=_ƕ?JEX\Zw-WVCV6/zɫ r)f [-X`GkkbwTXW%9n [\q9Sf\۲}F2סGyS [dGƽ%p/ۯz7:t7?PC)Z +endstream +endobj +242 0 obj +<< +/Filter /FlateDecode +/Length 8346 +>> +stream +x][%m~?XvsA oP%gؙ֑(^>TP ,j5ǟn9Vi}pb)~ ?_~ &O_HL{]Kt~˞_n:,w_~|w}~x``d-03SL 30s02f&׌H}hGT?GhZ+.?o|l>ři]--Ak0ϊ1܅)'DmP4 e&f&ap㋩hӂFc~4GT+or LJ{Ѿ9w7 kjCWamppGbs418 ܉c6ma"M6DRܓNS+r&g)Odn<5-w$ڱ<X5X6=,ϭ_X 熳N,֖e&l ]ЊʒNn](hcxp\[s3|Z'se kS-~/}LK_?e5îJIb߂YB[T`5tklR eax;lT#4}x37.6%V&s+[me2ksѰi_;NV q2k$8`X%⎓p­vL'|eYعpR,vn8){0lu-o9[UNj-'s;896LbVI<ع]$XѰ[/3-?[65$8BFɉ|kg[~Zk9+Ͳ8gS"Z'7reK$D.]Y| 54oD_uҼ'5&Z$:ZH~'դY&SYL-IcG|V5r{|}9盓Bx/?ݾy!{_"HkN>ן@?,_qu<˗?.8Bz\ϐ2 //_nkIXwu-Q?JFZ~T+kg&pseyC"њ2bۥB5SF*L5[]*%mk\+1 {.߼_+u ~~ER]a5^>c\)0mtiu1CthRd´qu"<U#'{ȋq/49"yVlo7%_ Ѹ6y1 (T"vB1Bi ~(Vk(7S*9#e%~!LC2,wLd3hf\>=&WpF4Lp ["ۦJܪй(Li*.N_.?`$.I88M +SJmh'*X5ڑvg-nlLSy1>m}B%d}GEilH*jR`1SX$\=>B:2*f1ch.:A{IyЇqLd<{U۳X">`|ڣ%MfH>ɪgGL&G`Jcf9=^5".h; ::]CQe XSήNvV VN&e߁2eIcI3AIe1f!|:@9v|47htѨOѱ*d ҚMњܚcn5r3w]Lu8[J۵~Y`Ny^#,=@026 +44[s $˹cf}tmgr\56ir\#N!9J90T㜠2Yg*PM,hX/8K5ܒB;%WSi{\al)dj?-"Lc jH7+JlaHe38)'m˞&3\̦f&4)dO]Mk?͙ u*4Ơ0il.{?,ۮ:2|e,7ëo`t|ŭzs $K玛F~>_ah9nq 4jM Hu!T+HXl%iɳfa1il>`„*346hpillR4vVx PAcK7~4ʟGt5-2mJχ\ʘc#Mmi{e6ҬˊUiGS;ph˥B+!+I'+dV; +yF EAEA1f;c\c\kʡV1g*)*ERCT1GUݛ? @;e%Lsg9Www8|4g.5 O4ֻb( +AnQ!$o] ? 3'ٛJ2Υ/QzbN.CmG}.g(s=?ios1-?b+c%0-.ʴrH[},+E)3W^%B^z.gVZ~{D,BQ,+8i4-1B1ձ<Ш%Rw*o RiTmf̓ZrAp-G +Mrr2HV$H쓐qUG:P|o؟F>`.ꃏ2,%T PikgJXCp/>Y\]uQ4ݼLJ MA?T]5?Akf b-qc Q&ggm[`}@eeUVo;Z˲ԞvKvht.v<X]BMu,HY=A!f/P o 6RemGzF'۲ÙQrF* y5*y|u}[ ɺuѹcnri8O}C̘ɺ܅DBdb5IL=Jl%KYv1Ӣu4@Qs3&.TmV$7~F\ˤ..`SF ٺcWXrFJM2kϦf vY#[T& lPYQYZ?b-U"fl .F$q1rM^}EÏcj$޶ 6tRfáYp% d,EQ0FƘ>>cK3jia'Ģ%83$S[ٹcZKI,$fLmin Z:܅ȴ8i3]1&\`HN1=ֺml{xR}F{‹,6 +Nn5(ZkMƎl;[7u ku0NMΨk䶺f/ryv/q=s{2)aJ[|r{j)+-՟ =g^Ѧw\B#@|Gf6L&gSXm +~¢?Ja1SX Q +MaÚ#nSX k}y bܤÑ3.Lre3YXgdk}֙$]t&4B6gWG:P|ؤ),Gd4[=SXq0^9(mrVhNa9NKbCm sX351eǚm.*0/CֳT e,oObI,&)oD$6>v؆KbS]$6$6}>MGj'm$MuMF)oý#ILVch4p!)3=F:L6r.o&yQ^TShR{lzx;$R wHmNEvʘ{4bŃm6A4smBC[2i" +Ƣ)+MʊsXCZ+T4]PX?Q!Zⶾ>*T_+tUM&–ZdxYmJeR٧5Or9]Ͱa)] e7gm[9]st5>]06pG GL2Ygߤpf&"1IaIMՑ&6*eRާU}Jq%:HW*>]%:HW*h s5c1&16F;g xA|v%??!]-6]AUJtRڤ&]הvj4rMiNW6]pNW9]{JtU)*߹NzG٪ő\pcj=k8cZekfH.WiL0 ]FvL1NRfj.>"]oEo72rsq4vhS1c\rlu@ \'s4r,LJj2G,Vy9FjMY{eq *Vu&֪ǜp? i[SXU'RpfkKRH^>L&G"h y"KGK%zڜ6?Y':b +n"ڴ] +7 + +moo:((?g +E^Wyc] fΖ 2:&15qKoL$dlbt6JG^%#"WȫăȫYwgJ<J^%6mMU`!/3;֙&.qwZJKU)4_\J$ "z ixuM5|hHA +Qq˸5*j6jgWCK Nnjfuc@xWuc<)x^I/'HnFHDr)Er)[wL+RQȬ2#9ŞnK#2u LkS0dnLn163Q1s45}u>>Ξ:85ngd`}B!&-CTlJas(r!빣&2 hv ٍmn2[>fw ,\vWѲ{+V^\EZ\VˬZq@_V}J_O@T=v9|8zܺz|87% +@aLLk-rhԡR +4*S@6\\jf̀P+G8^_e0d%v}?%l~&*Dʯ2cr ɉ4,:(gzƮ 8YۊLn0n[ -^i^`E +{֬AVݯ? *b@ I緅=,6/۫a{eUYrwwަ_ 7Cn_Mwt%o @m\2.Wi#hA"Be"|tAhwI;p\s=ڄΗIH}Tzェ]|܁p\Uλ& 9Ã_u-PWUf +Gxm&ハЯϾ{=7 aw,z1)j9!(H+`oL"G] +i8/`Ȃ~8~RgN/'U%*P]s5:/N9vU^ +A\}|qqMx ]{Vp_3$l +62堁e +/r@~M^tαjxt[5ófs\[_@S>nsJyh7aҨLTΑѪ| AzU;5EW򂜸V֏b o`{Yǂ>WBN ‡'Sρ:Lk  A佾^:t</飡s<5^?J:wX`ζ O{5PrȦKq0f{Mi>mXC{+>"_:U3(v^ ?Ν#|lbXis(9/;$+kO^RpU;ٲBq3LԶ?Wy1@ǶF["s[39~tr0rKr " [ +_c #G8>nJҒQF>.s :&_%vA~D0Gk<`9=,'0r)g9/g94(%^]goo)`{5LQg.e@d{ +7 y+&ⅡOf!@Hgp\2|*V֝caS].-P#4^s9l8P(|EfH )RV_`qg>H|[:բ +endstream +endobj +243 0 obj +<< +/Filter /FlateDecode +/Length 3442 +>> +stream +x[]+}ׯBW"`PkFI@ ynE0voůfwku`l_K*qnR|M0+7|ߟvB N(L/y')AՏ:}C +\V^O.14^w~էL_.}`r"$0 >ŪMLU9Dhx߳[U?t\28h6hX5 ʀ-,`Sæt 6~m\;a۟ c4DvժV eCى;ʶWH{--VѪ[p{=Nfu7؊`gJܰdR nXr"Y*DaJZ%7݊tgJްdCoX6msD3w$c(S RYILG,@=@?Fz27lx"{1tg-Z)vuFFXECӪ6WJw`[6ZŌn6XwJ7:^DVZn% T$NeN2?U8d")T7vݰ~C @"@R4@;&=0}_.tz;aryYDes*ˊO.@dY\L7&ԄCFD!"\b⬛b"* `XB \ +ɷ yS EhyQ.>"j~ks!] + h( +A3p$&kjj5 @^H_A#"pģp8xD¢`޶E!k`AKts(5"z-0.^o֟8I $z0^. l.ۂ +!ld.t~X)pbUf=$6_{2?? +< I+3(5E'_x 0?O)p4${l,E>}=Ww֞\+ Ģ%f6ShyxWT-}X{Cg$'iD(+ VC O3}ݘ.$IeYDώKݵF!b5RL )φ~^YQ^:` fG|LbL:B:GH{BE@N-ƈyJbAa'2RMH1!_Gڡd{Yb^2fbШCqqX^*عմG Bod__r-Q LA0zb\Πue~w<'kȌ-Gg$l73ql& ^!^ ۅ+A^Dgr6; + ?q`Q?IYmUm(wL<<8J*t٫/hN.yBcb.'d*g|H&{}!dwMH^e遼#kGp8; q_E<6"9n8` q.JkJy0u|$ M|$ošM}_B4Ds1x 2m3o9JriE=J^V1qKr>7Op^5$@@_Lty}}om +җ϶d\q>Hsצד!Kq; ;oqByvɐ3Ȑ.9%>t\$R4VD_#>trtGE_LƏ ]q$+>rVd;왅KpGΐ/rˡl l1"s/(s.:EH[ra9z$Δ#n8 ?t6 fѕzuQ&\uWd)ac$DqcΞW^dg"s]|̲Etј%Kԗ߶o~o4tjO/V[[8^_]ˈR>{ +p`k'G3Sl=vOXg`uINݗ $#B4 0GZs;V +z<86.s3z@eѝ:1C{fۗŬ NkR]qԥ'6E2<>8 +endstream +endobj +244 0 obj +<< +/Filter /FlateDecode +/Length 3635 +>> +stream +x\[ ~_1"# i M8Ehf=A w!)#EQK7wN"41r4venrwW#T=w?N~czݏ?_'|&D8}/#rB1Y)`q"0h1e!!NOA>dr4K ,DgL@$1@v&d!ljX/8$d /#O3q)`,/8ˀbU":@`K-a"Znj.)ZnWrQ"Z^\!O(j-G3N7Q/"<\E='R"+Y֢U&ZT[ #,&,"t_mk&Z CW&G n4Ӓ!'JŖ˗S5I֟Tn(,-3wtޔ~mM6cUU}|yHxfiڟA]]韧_N/+ -P +"@AX9㬕Z= +gME&4*Pd=P$DE|]E&4oaLT{E(6]7n\jQ|5+G-_:Ho!w< Hy\z,HeҢ {HD$bxh!(],;HPQ|AZY"]Pe iZOUzWe5VRYkuj^vu, 2TR +X98{ΉDN$"O:7hM0}MD4L<9-]sfrpӁ n!-DsO+ % VRR<*a8ѬOE4!Fi >0ZCNF) c0ԉ& fAOn %\O& ;IŘGCȭwU41E4ko)u^jR + `B`J .ɿ[ ^Af3)Xh6#n7n K-6@oϏK?I$8&88g3@d 4}ZcM +VEwQ.hBt +Se*Pҳ4 q1+cŚ#Mܼqw* 5b_iVy}}q})r+/}51+frUch AL}Q8-ŽX#wl | J<" LJa‘;*="u;;0ސũSG.|8_ +OjnG}#/:I| s +l n2f(j䵉g%-vZ'5k-Y^H̲<9^x$^R?рIJ-Qc(1Cf +?{cqe}h%/@^K:pū pZ4!ģh~F̾s9ÍJO`i-<`#%xbt9{/|+GV' NkO_"Uf*$Y0=Q umM²12VIcc<`#6 +Oڢ*lQU[kAy}eե~ʾA*[ˁE2Xcw}ǵˆJwH++FJCRA̜!煺ƺs#_p]r`᲏RcP姖Q+ T~Vv#?wMVw`-H&kJm[\J +@)DjD9Z~<+%e9YŔ'g=G0_xPXe[>݀I%>jՀ}A bJrP@%O${r_r*/rDn%W1d姯&%xX~TH^2i#-,կL)(#aUwG(qt:kzh}_\: gsTx)o]cl ڃoej̕DucKT?0PJ<[Q-4lX%3RJ/mA=OeU\X K>ꉒ*pبJ(LҠDCJ<,B )Kp@,R% H/t!brM=!hFTEx}h^+X#m4 }dg=$yO*"wԼHLEZ*$ƹ6 ;r݌>^ Y8Si%zt|$"S ԭUQF(a0VG Ù+lRVdmiߣ;ҼZ 沫dP v6lFE o  Uf"= Ueɴ֓S{#FSjZ^ Ug=$p`wҚkdzDdF;Pi6'b>bf8%ԦK[gvQke|,@sQPϣVIX9%PSiȜ5#2j!n/s +j4Rbak*t^ȫe^^/QivA돊miZ*-?gz?_HPkqТ2Te:M~|S/OF記ZF.oI1L5fuZ=Vۻ-jl-]Wt9vrFGyx l2yxrm> r{ +ϟS29;1gx~&1-CRNէGcS❱RzL<`ܜI>_rm9|.BNխwAM<ߦF*AB/ )$m\ɂȸ=5g17X"9ovpէJ}szmyd~Ҫ[jNuo<S lۓ0Gg-F򴍔7Bu1c*mUtS__s"T|O׬o{ӗ*(s*+e}]k\v57ڼx%s0r?z ^KeRRưU} :[kkNk'CX$&XsD7e`ͫ:=x *9RMf^[Z,R~uVtQkdRƑ ()y˪0MZQ: + ެOdo.o?xo7Jkb7NooxSiM:hlzJﻍk]V{ccG`#lIy >^JM%a/:s!9r&j#r&z\HlnJWu|{lR2l:Қ`B6/EϕOarODI@6/lIil8APϗ%t$is$~|I41nN^IDGI;`|)ۆ[ 1$ZPkL<S<L}[o ) +endstream +endobj +245 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00001886) +/K [867 0 R 6] +/P 343 0 R +/Pg 11 0 R +/S /TH +/Type /StructElem +>> +endobj +246 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00001887) +/K [868 0 R 7] +/P 343 0 R +/Pg 11 0 R +/S /TH +/Type /StructElem +>> +endobj +247 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00001888) +/K [869 0 R 8] +/P 343 0 R +/Pg 11 0 R +/S /TH +/Type /StructElem +>> +endobj +248 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00001889) +/K [870 0 R 9] +/P 343 0 R +/Pg 11 0 R +/S /TH +/Type /StructElem +>> +endobj +249 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00001890) +/K [871 0 R 10] +/P 343 0 R +/Pg 11 0 R +/S /TH +/Type /StructElem +>> +endobj +250 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00001944) +/K [908 0 R 15 << +/MCID 0 +/Pg 12 0 R +/Type /MCR +>>] +/P 351 0 R +/Pg 11 0 R +/S /TH +/Type /StructElem +>> +endobj +251 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00001945) +/K [909 0 R 16 << +/MCID 1 +/Pg 12 0 R +/Type /MCR +>>] +/P 351 0 R +/Pg 11 0 R +/S /TH +/Type /StructElem +>> +endobj +252 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00001946) +/K [910 0 R 17 << +/MCID 2 +/Pg 12 0 R +/Type /MCR +>>] +/P 351 0 R +/Pg 11 0 R +/S /TH +/Type /StructElem +>> +endobj +253 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00001947) +/K [911 0 R 18 << +/MCID 3 +/Pg 12 0 R +/Type /MCR +>>] +/P 351 0 R +/Pg 11 0 R +/S /TH +/Type /StructElem +>> +endobj +254 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002266) +/K [1199 0 R 13 << +/MCID 0 +/Pg 13 0 R +/Type /MCR +>>] +/P 382 0 R +/Pg 12 0 R +/S /TH +/Type /StructElem +>> +endobj +255 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002267) +/K [1200 0 R 14 << +/MCID 1 +/Pg 13 0 R +/Type /MCR +>>] +/P 382 0 R +/Pg 12 0 R +/S /TH +/Type /StructElem +>> +endobj +256 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002268) +/K [1201 0 R 15 << +/MCID 2 +/Pg 13 0 R +/Type /MCR +>>] +/P 382 0 R +/Pg 12 0 R +/S /TH +/Type /StructElem +>> +endobj +257 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002269) +/K [1202 0 R 16 << +/MCID 3 +/Pg 13 0 R +/Type /MCR +>>] +/P 382 0 R +/Pg 12 0 R +/S /TH +/Type /StructElem +>> +endobj +258 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002359) +/K [1298 0 R 8] +/P 400 0 R +/Pg 13 0 R +/S /TH +/Type /StructElem +>> +endobj +259 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002360) +/K [1299 0 R 9] +/P 400 0 R +/Pg 13 0 R +/S /TH +/Type /StructElem +>> +endobj +260 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002361) +/K [1300 0 R 10] +/P 400 0 R +/Pg 13 0 R +/S /TH +/Type /StructElem +>> +endobj +261 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002435) +/K [1363 0 R 18 << +/MCID 0 +/Pg 14 0 R +/Type /MCR +>>] +/P 414 0 R +/Pg 13 0 R +/S /TH +/Type /StructElem +>> +endobj +262 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002436) +/K [1364 0 R 19 << +/MCID 1 +/Pg 14 0 R +/Type /MCR +>>] +/P 414 0 R +/Pg 13 0 R +/S /TH +/Type /StructElem +>> +endobj +263 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002437) +/K [1365 0 R 20 << +/MCID 2 +/Pg 14 0 R +/Type /MCR +>>] +/P 414 0 R +/Pg 13 0 R +/S /TH +/Type /StructElem +>> +endobj +264 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002458) +/K [1375 0 R 7] +/P 421 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +265 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002459) +/K [1376 0 R 8] +/P 421 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +266 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002460) +/K [1377 0 R 9] +/P 421 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +267 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002504) +/K [1405 0 R 14] +/P 432 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +268 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002505) +/K [1406 0 R 15] +/P 432 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +269 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002506) +/K [1407 0 R 16] +/P 432 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +270 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002507) +/K [1408 0 R 17] +/P 432 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +271 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002548) +/K [1442 0 R 20 << +/MCID 0 +/Pg 15 0 R +/Type /MCR +>>] +/P 461 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +272 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002549) +/K [1443 0 R 21 << +/MCID 1 +/Pg 15 0 R +/Type /MCR +>>] +/P 461 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +273 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002550) +/K [1444 0 R 22 << +/MCID 2 +/Pg 15 0 R +/Type /MCR +>>] +/P 461 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +274 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002551) +/K [1445 0 R 23 << +/MCID 3 +/Pg 15 0 R +/Type /MCR +>>] +/P 461 0 R +/Pg 14 0 R +/S /TH +/Type /StructElem +>> +endobj +275 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002641) +/K [1507 0 R 7] +/P 475 0 R +/Pg 15 0 R +/S /TH +/Type /StructElem +>> +endobj +276 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002642) +/K [1508 0 R 8] +/P 475 0 R +/Pg 15 0 R +/S /TH +/Type /StructElem +>> +endobj +277 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002643) +/K [1509 0 R 9] +/P 475 0 R +/Pg 15 0 R +/S /TH +/Type /StructElem +>> +endobj +278 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002673) +/K [1523 0 R 15] +/P 485 0 R +/Pg 15 0 R +/S /TH +/Type /StructElem +>> +endobj +279 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002674) +/K [1524 0 R 16] +/P 485 0 R +/Pg 15 0 R +/S /TH +/Type /StructElem +>> +endobj +280 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00002675) +/K [1525 0 R 17] +/P 485 0 R +/Pg 15 0 R +/S /TH +/Type /StructElem +>> +endobj +281 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003027) +/K [1808 0 R 1] +/P 636 0 R +/Pg 18 0 R +/S /TH +/Type /StructElem +>> +endobj +282 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003028) +/K [1809 0 R 2] +/P 636 0 R +/Pg 18 0 R +/S /TH +/Type /StructElem +>> +endobj +283 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003029) +/K [1810 0 R 3] +/P 636 0 R +/Pg 18 0 R +/S /TH +/Type /StructElem +>> +endobj +284 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003171) +/K [1910 0 R 1] +/P 699 0 R +/Pg 19 0 R +/S /TH +/Type /StructElem +>> +endobj +285 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003172) +/K [1911 0 R 2] +/P 699 0 R +/Pg 19 0 R +/S /TH +/Type /StructElem +>> +endobj +286 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003173) +/K [1912 0 R 3] +/P 699 0 R +/Pg 19 0 R +/S /TH +/Type /StructElem +>> +endobj +287 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003174) +/K [1913 0 R 4] +/P 699 0 R +/Pg 19 0 R +/S /TH +/Type /StructElem +>> +endobj +288 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003385) +/K [2092 0 R 2] +/P 745 0 R +/Pg 20 0 R +/S /TH +/Type /StructElem +>> +endobj +289 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003386) +/K [2093 0 R 3] +/P 745 0 R +/Pg 20 0 R +/S /TH +/Type /StructElem +>> +endobj +290 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003387) +/K [2094 0 R 4] +/P 745 0 R +/Pg 20 0 R +/S /TH +/Type /StructElem +>> +endobj +291 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003465) +/K [2160 0 R 0] +/P 788 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +292 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003466) +/K [2161 0 R 1] +/P 788 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +293 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003467) +/K [2162 0 R 2] +/P 788 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +294 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003491) +/K [2175 0 R 8] +/P 795 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +295 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003492) +/K [2176 0 R 9] +/P 795 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +296 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003493) +/K [2177 0 R 10] +/P 795 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +297 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003494) +/K [2178 0 R 11] +/P 795 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +298 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003521) +/K [2195 0 R 15] +/P 801 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +299 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003522) +/K [2196 0 R 16] +/P 801 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +300 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003523) +/K [2197 0 R 17] +/P 801 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +301 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003557) +/K [2219 0 R 22 << +/MCID 0 +/Pg 22 0 R +/Type /MCR +>>] +/P 810 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +302 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003558) +/K [2220 0 R 23 << +/MCID 1 +/Pg 22 0 R +/Type /MCR +>>] +/P 810 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +303 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003559) +/K [2221 0 R 24 << +/MCID 2 +/Pg 22 0 R +/Type /MCR +>>] +/P 810 0 R +/Pg 21 0 R +/S /TH +/Type /StructElem +>> +endobj +304 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003589) +/K [2240 0 R 6] +/P 818 0 R +/Pg 22 0 R +/S /TH +/Type /StructElem +>> +endobj +305 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/ID (node00003590) +/K [2241 0 R 7] +/P 818 0 R +/Pg 22 0 R +/S /TH +/Type /StructElem +>> +endobj +306 0 obj +<< +/K 23 +/P 25 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +307 0 obj +<< +/K [2482 0 R 833 0 R 2483 0 R 835 0 R 2484 0 R 837 0 R 2485 0 R 839 0 R] +/P 26 0 R +/S /P +/Type /StructElem +>> +endobj +308 0 obj +<< +/K 32 +/P 28 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +309 0 obj +<< +/K [840 0 R 2486 0 R] +/P 29 0 R +/S /LI +/Type /StructElem +>> +endobj +310 0 obj +<< +/K [842 0 R 2487 0 R] +/P 29 0 R +/S /LI +/Type /StructElem +>> +endobj +311 0 obj +<< +/K [844 0 R 2488 0 R] +/P 29 0 R +/S /LI +/Type /StructElem +>> +endobj +312 0 obj +<< +/K [846 0 R 2489 0 R] +/P 29 0 R +/S /LI +/Type /StructElem +>> +endobj +313 0 obj +<< +/K [848 0 R 2490 0 R] +/P 29 0 R +/S /LI +/Type /StructElem +>> +endobj +314 0 obj +<< +/K [850 0 R 2491 0 R] +/P 29 0 R +/S /LI +/Type /StructElem +>> +endobj +315 0 obj +<< +/K [852 0 R 2492 0 R] +/P 29 0 R +/S /LI +/Type /StructElem +>> +endobj +316 0 obj +<< +/K [854 0 R 2493 0 R] +/P 29 0 R +/S /LI +/Type /StructElem +>> +endobj +317 0 obj +<< +/K 49 +/P 31 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +318 0 obj +<< +/K 50 +/P 32 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +319 0 obj +<< +/K 51 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +320 0 obj +<< +/K 856 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +321 0 obj +<< +/K 53 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +322 0 obj +<< +/K 857 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +323 0 obj +<< +/K 55 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +324 0 obj +<< +/K 858 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +325 0 obj +<< +/K 57 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +326 0 obj +<< +/K 859 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +327 0 obj +<< +/K 59 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +328 0 obj +<< +/K 860 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +329 0 obj +<< +/K 61 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +330 0 obj +<< +/K 861 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +331 0 obj +<< +/K 63 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +332 0 obj +<< +/K 862 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +333 0 obj +<< +/K 65 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +334 0 obj +<< +/K 863 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +335 0 obj +<< +/K 67 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +336 0 obj +<< +/K 864 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +337 0 obj +<< +/K 69 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +338 0 obj +<< +/K 865 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +339 0 obj +<< +/K 71 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +340 0 obj +<< +/K 866 0 R +/P 33 0 R +/S /Strong +/Type /StructElem +>> +endobj +341 0 obj +<< +/K 73 +/P 33 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +342 0 obj +<< +/K 74 +/P 34 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +343 0 obj +<< +/K [245 0 R 246 0 R 247 0 R 248 0 R 249 0 R] +/P 35 0 R +/S /TR +/Type /StructElem +>> +endobj +344 0 obj +<< +/K [2494 0 R 2495 0 R 2496 0 R 2497 0 R 2498 0 R] +/P 35 0 R +/S /TR +/Type /StructElem +>> +endobj +345 0 obj +<< +/K [2499 0 R 2500 0 R 2501 0 R 2502 0 R 2503 0 R 11] +/P 35 0 R +/Pg 11 0 R +/S /TR +/Type /StructElem +>> +endobj +346 0 obj +<< +/K [2504 0 R 2505 0 R 2506 0 R 2507 0 R 2508 0 R] +/P 35 0 R +/S /TR +/Type /StructElem +>> +endobj +347 0 obj +<< +/K [2509 0 R 2510 0 R 2511 0 R 2512 0 R 2513 0 R 12] +/P 35 0 R +/Pg 11 0 R +/S /TR +/Type /StructElem +>> +endobj +348 0 obj +<< +/K [2514 0 R 2515 0 R 2516 0 R 2517 0 R 2518 0 R] +/P 35 0 R +/S /TR +/Type /StructElem +>> +endobj +349 0 obj +<< +/K [2519 0 R 2520 0 R 2521 0 R 2522 0 R 2523 0 R 13] +/P 35 0 R +/Pg 11 0 R +/S /TR +/Type /StructElem +>> +endobj +350 0 obj +<< +/K 116 +/P 36 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +351 0 obj +<< +/K [250 0 R 251 0 R 252 0 R 253 0 R] +/P 37 0 R +/S /TR +/Type /StructElem +>> +endobj +352 0 obj +<< +/K [2524 0 R 2525 0 R 2526 0 R 2527 0 R] +/P 37 0 R +/S /TR +/Type /StructElem +>> +endobj +353 0 obj +<< +/K [2528 0 R 2529 0 R 2530 0 R 2531 0 R 19] +/P 37 0 R +/Pg 11 0 R +/S /TR +/Type /StructElem +>> +endobj +354 0 obj +<< +/K [2532 0 R 2533 0 R 2534 0 R 2535 0 R] +/P 37 0 R +/S /TR +/Type /StructElem +>> +endobj +355 0 obj +<< +/K [2536 0 R 2537 0 R 2538 0 R 2539 0 R 20] +/P 37 0 R +/Pg 11 0 R +/S /TR +/Type /StructElem +>> +endobj +356 0 obj +<< +/K [2540 0 R 2541 0 R 2542 0 R 2543 0 R] +/P 37 0 R +/S /TR +/Type /StructElem +>> +endobj +357 0 obj +<< +/K [2544 0 R 2545 0 R 2546 0 R 2547 0 R 21] +/P 37 0 R +/Pg 11 0 R +/S /TR +/Type /StructElem +>> +endobj +358 0 obj +<< +/K [2548 0 R 2549 0 R 2550 0 R 2551 0 R] +/P 37 0 R +/S /TR +/Type /StructElem +>> +endobj +359 0 obj +<< +/K [2552 0 R 2553 0 R 2554 0 R 2555 0 R 4] +/P 37 0 R +/Pg 12 0 R +/S /TR +/Type /StructElem +>> +endobj +360 0 obj +<< +/K [2556 0 R 2557 0 R 2558 0 R 2559 0 R] +/P 37 0 R +/S /TR +/Type /StructElem +>> +endobj +361 0 obj +<< +/K [2560 0 R 2561 0 R 2562 0 R 2563 0 R 5] +/P 37 0 R +/Pg 12 0 R +/S /TR +/Type /StructElem +>> +endobj +362 0 obj +<< +/K 43 +/P 38 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +363 0 obj +<< +/K [962 0 R 44] +/P 39 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +364 0 obj +<< +/K 46 +/P 39 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +365 0 obj +<< +/K [963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R +979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R 994 0 R +995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R +1011 0 R 1012 0 R 1013 0 R 1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1026 0 R +1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R +1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R +1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R +1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R +1091 0 R 1092 0 R] +/P 40 0 R +/S /Code +/Type /StructElem +>> +endobj +366 0 obj +<< +/K [1093 0 R 177] +/P 41 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +367 0 obj +<< +/K 179 +/P 41 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +368 0 obj +<< +/K [1094 0 R 1095 0 R 1096 0 R 1097 0 R 1098 0 R 1099 0 R 1100 0 R 1101 0 R 1102 0 R 1103 0 R 1104 0 R 1105 0 R 1106 0 R 1107 0 R 1108 0 R 1109 0 R +1110 0 R 1111 0 R 1112 0 R 1113 0 R 1114 0 R 1115 0 R 1116 0 R 1117 0 R 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R 1124 0 R 1125 0 R +1126 0 R 1127 0 R 1128 0 R 1129 0 R 1130 0 R 1131 0 R 1132 0 R] +/P 42 0 R +/S /Code +/Type /StructElem +>> +endobj +369 0 obj +<< +/K [1133 0 R 219] +/P 43 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +370 0 obj +<< +/K 221 +/P 43 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +371 0 obj +<< +/K [1134 0 R 1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1144 0 R 1145 0 R 1146 0 R 1147 0 R 1148 0 R 1149 0 R +1150 0 R 1151 0 R 1152 0 R 1153 0 R 1154 0 R 1155 0 R 1156 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R 1165 0 R +1166 0 R 1167 0 R 1168 0 R 1169 0 R] +/P 44 0 R +/S /Code +/Type /StructElem +>> +endobj +372 0 obj +<< +/K [1170 0 R 258] +/P 45 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +373 0 obj +<< +/K 260 +/P 45 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +374 0 obj +<< +/K [1171 0 R 1172 0 R 1173 0 R 1174 0 R 1175 0 R 1176 0 R 1177 0 R 1178 0 R 1179 0 R 1180 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R +1187 0 R 1188 0 R 1189 0 R 1190 0 R 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R] +/P 46 0 R +/S /Code +/Type /StructElem +>> +endobj +375 0 obj +<< +/K 287 +/P 48 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +376 0 obj +<< +/K 288 +/P 49 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +377 0 obj +<< +/K 1197 0 R +/P 49 0 R +/S /Strong +/Type /StructElem +>> +endobj +378 0 obj +<< +/K 290 +/P 50 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +379 0 obj +<< +/K 1198 0 R +/P 50 0 R +/S /Strong +/Type /StructElem +>> +endobj +380 0 obj +<< +/K 292 +/P 50 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +381 0 obj +<< +/K 293 +/P 51 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +382 0 obj +<< +/K [254 0 R 255 0 R 256 0 R 257 0 R] +/P 52 0 R +/S /TR +/Type /StructElem +>> +endobj +383 0 obj +<< +/K [2564 0 R 2565 0 R 2566 0 R 2567 0 R] +/P 52 0 R +/S /TR +/Type /StructElem +>> +endobj +384 0 obj +<< +/K [2568 0 R 2569 0 R 2570 0 R 2571 0 R 17] +/P 52 0 R +/Pg 12 0 R +/S /TR +/Type /StructElem +>> +endobj +385 0 obj +<< +/K [2572 0 R 2573 0 R 2574 0 R 2575 0 R] +/P 52 0 R +/S /TR +/Type /StructElem +>> +endobj +386 0 obj +<< +/K [2576 0 R 2577 0 R 2578 0 R 2579 0 R 4] +/P 52 0 R +/Pg 13 0 R +/S /TR +/Type /StructElem +>> +endobj +387 0 obj +<< +/K [2580 0 R 2581 0 R 2582 0 R 2583 0 R] +/P 52 0 R +/S /TR +/Type /StructElem +>> +endobj +388 0 obj +<< +/K [2584 0 R 2585 0 R 2586 0 R 2587 0 R 5] +/P 52 0 R +/Pg 13 0 R +/S /TR +/Type /StructElem +>> +endobj +389 0 obj +<< +/K [2588 0 R 2589 0 R 2590 0 R 2591 0 R] +/P 52 0 R +/S /TR +/Type /StructElem +>> +endobj +390 0 obj +<< +/K [2592 0 R 2593 0 R 2594 0 R 2595 0 R 6] +/P 52 0 R +/Pg 13 0 R +/S /TR +/Type /StructElem +>> +endobj +391 0 obj +<< +/K 65 +/P 53 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +392 0 obj +<< +/K [1257 0 R 2596 0 R 1259 0 R] +/P 54 0 R +/S /LI +/Type /StructElem +>> +endobj +393 0 obj +<< +/K [1260 0 R 2597 0 R 1262 0 R 1263 0 R 1265 0 R 1266 0 R 1268 0 R 1269 0 R 1271 0 R 1272 0 R 1274 0 R 1275 0 R 1277 0 R] +/P 54 0 R +/S /LI +/Type /StructElem +>> +endobj +394 0 obj +<< +/K [1278 0 R 2598 0 R 1280 0 R 1281 0 R 1283 0 R 1284 0 R] +/P 54 0 R +/S /LI +/Type /StructElem +>> +endobj +395 0 obj +<< +/K [1286 0 R 2599 0 R 1288 0 R] +/P 54 0 R +/S /LI +/Type /StructElem +>> +endobj +396 0 obj +<< +/K [1289 0 R 2600 0 R 1291 0 R] +/P 54 0 R +/S /LI +/Type /StructElem +>> +endobj +397 0 obj +<< +/K [1292 0 R 2601 0 R 1294 0 R 1295 0 R 1297 0 R] +/P 54 0 R +/S /LI +/Type /StructElem +>> +endobj +398 0 obj +<< +/K 107 +/P 55 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +399 0 obj +<< +/K 108 +/P 56 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +400 0 obj +<< +/K [258 0 R 259 0 R 260 0 R] +/P 57 0 R +/S /TR +/Type /StructElem +>> +endobj +401 0 obj +<< +/K [2602 0 R 2603 0 R 2604 0 R] +/P 57 0 R +/S /TR +/Type /StructElem +>> +endobj +402 0 obj +<< +/K [2605 0 R 2606 0 R 2607 0 R 11] +/P 57 0 R +/Pg 13 0 R +/S /TR +/Type /StructElem +>> +endobj +403 0 obj +<< +/K [2608 0 R 2609 0 R 2610 0 R] +/P 57 0 R +/S /TR +/Type /StructElem +>> +endobj +404 0 obj +<< +/K [2611 0 R 2612 0 R 2613 0 R 12] +/P 57 0 R +/Pg 13 0 R +/S /TR +/Type /StructElem +>> +endobj +405 0 obj +<< +/K [2614 0 R 2615 0 R 2616 0 R] +/P 57 0 R +/S /TR +/Type /StructElem +>> +endobj +406 0 obj +<< +/K [2617 0 R 2618 0 R 2619 0 R 13] +/P 57 0 R +/Pg 13 0 R +/S /TR +/Type /StructElem +>> +endobj +407 0 obj +<< +/K [2620 0 R 2621 0 R 2622 0 R] +/P 57 0 R +/S /TR +/Type /StructElem +>> +endobj +408 0 obj +<< +/K [2623 0 R 2624 0 R 2625 0 R 14] +/P 57 0 R +/Pg 13 0 R +/S /TR +/Type /StructElem +>> +endobj +409 0 obj +<< +/K [2626 0 R 2627 0 R 2628 0 R] +/P 57 0 R +/S /TR +/Type /StructElem +>> +endobj +410 0 obj +<< +/K [2629 0 R 2630 0 R 2631 0 R 15] +/P 57 0 R +/Pg 13 0 R +/S /TR +/Type /StructElem +>> +endobj +411 0 obj +<< +/K [2632 0 R 2633 0 R 2634 0 R] +/P 57 0 R +/S /TR +/Type /StructElem +>> +endobj +412 0 obj +<< +/K [2635 0 R 1353 0 R 1354 0 R 1356 0 R 1357 0 R 1359 0 R 1360 0 R 1362 0 R] +/P 58 0 R +/S /P +/Type /StructElem +>> +endobj +413 0 obj +<< +/K 180 +/P 59 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +414 0 obj +<< +/K [261 0 R 262 0 R 263 0 R] +/P 60 0 R +/S /TR +/Type /StructElem +>> +endobj +415 0 obj +<< +/K [2636 0 R 2637 0 R 2638 0 R] +/P 60 0 R +/S /TR +/Type /StructElem +>> +endobj +416 0 obj +<< +/K [2639 0 R 2640 0 R 2641 0 R 3] +/P 60 0 R +/Pg 14 0 R +/S /TR +/Type /StructElem +>> +endobj +417 0 obj +<< +/K 36 +/P 62 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +418 0 obj +<< +/K 37 +/P 63 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +419 0 obj +<< +/K 1374 0 R +/P 64 0 R +/S /Strong +/Type /StructElem +>> +endobj +420 0 obj +<< +/K 39 +/P 65 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +421 0 obj +<< +/K [264 0 R 265 0 R 266 0 R] +/P 66 0 R +/S /TR +/Type /StructElem +>> +endobj +422 0 obj +<< +/K [2642 0 R 2643 0 R 2644 0 R] +/P 66 0 R +/S /TR +/Type /StructElem +>> +endobj +423 0 obj +<< +/K [2645 0 R 2646 0 R 2647 0 R 10] +/P 66 0 R +/Pg 14 0 R +/S /TR +/Type /StructElem +>> +endobj +424 0 obj +<< +/K [2648 0 R 2649 0 R 2650 0 R] +/P 66 0 R +/S /TR +/Type /StructElem +>> +endobj +425 0 obj +<< +/K [2651 0 R 2652 0 R 2653 0 R 11] +/P 66 0 R +/Pg 14 0 R +/S /TR +/Type /StructElem +>> +endobj +426 0 obj +<< +/K [2654 0 R 2655 0 R 2656 0 R] +/P 66 0 R +/S /TR +/Type /StructElem +>> +endobj +427 0 obj +<< +/K [2657 0 R 2658 0 R 2659 0 R 12] +/P 66 0 R +/Pg 14 0 R +/S /TR +/Type /StructElem +>> +endobj +428 0 obj +<< +/K 69 +/P 67 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +429 0 obj +<< +/K 70 +/P 68 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +430 0 obj +<< +/K 1404 0 R +/P 68 0 R +/S /Strong +/Type /StructElem +>> +endobj +431 0 obj +<< +/K 72 +/P 68 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +432 0 obj +<< +/K [267 0 R 268 0 R 269 0 R 270 0 R] +/P 69 0 R +/S /TR +/Type /StructElem +>> +endobj +433 0 obj +<< +/K [2660 0 R 2661 0 R 2662 0 R 2663 0 R] +/P 69 0 R +/S /TR +/Type /StructElem +>> +endobj +434 0 obj +<< +/K [2664 0 R 2665 0 R 2666 0 R 2667 0 R 18] +/P 69 0 R +/Pg 14 0 R +/S /TR +/Type /StructElem +>> +endobj +435 0 obj +<< +/K [2668 0 R 2669 0 R 2670 0 R 2671 0 R] +/P 69 0 R +/S /TR +/Type /StructElem +>> +endobj +436 0 obj +<< +/K 1430 0 R +/P 70 0 R +/S /Strong +/Type /StructElem +>> +endobj +437 0 obj +<< +/K 99 +/P 70 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +438 0 obj +<< +/K 1431 0 R +/P 70 0 R +/S /Strong +/Type /StructElem +>> +endobj +439 0 obj +<< +/K 101 +/P 70 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +440 0 obj +<< +/K [1432 0 R 102] +/P 70 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +441 0 obj +<< +/K 104 +/P 70 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +442 0 obj +<< +/K [1433 0 R 105] +/P 70 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +443 0 obj +<< +/K 107 +/P 70 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +444 0 obj +<< +/K [1434 0 R 108] +/P 70 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +445 0 obj +<< +/K 110 +/P 70 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +446 0 obj +<< +/K 1435 0 R +/P 71 0 R +/S /Strong +/Type /StructElem +>> +endobj +447 0 obj +<< +/K 112 +/P 71 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +448 0 obj +<< +/K [1436 0 R 113] +/P 71 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +449 0 obj +<< +/K 115 +/P 71 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +450 0 obj +<< +/K [1437 0 R 116] +/P 71 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +451 0 obj +<< +/K 118 +/P 71 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +452 0 obj +<< +/K [1438 0 R 119] +/P 71 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +453 0 obj +<< +/K 121 +/P 71 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +454 0 obj +<< +/K [1439 0 R 122] +/P 71 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +455 0 obj +<< +/K 124 +/P 71 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +456 0 obj +<< +/K [1440 0 R 125] +/P 71 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +457 0 obj +<< +/K 127 +/P 71 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +458 0 obj +<< +/K [1441 0 R 128 130] +/P 71 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +459 0 obj +<< +/K 132 +/P 71 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +460 0 obj +<< +/K 133 +/P 72 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +461 0 obj +<< +/K [271 0 R 272 0 R 273 0 R 274 0 R] +/P 73 0 R +/S /TR +/Type /StructElem +>> +endobj +462 0 obj +<< +/K [2672 0 R 2673 0 R 2674 0 R 2675 0 R] +/P 73 0 R +/S /TR +/Type /StructElem +>> +endobj +463 0 obj +<< +/K [2676 0 R 2677 0 R 2678 0 R 2679 0 R 24] +/P 73 0 R +/Pg 14 0 R +/S /TR +/Type /StructElem +>> +endobj +464 0 obj +<< +/K [2680 0 R 2681 0 R 2682 0 R 2683 0 R] +/P 73 0 R +/S /TR +/Type /StructElem +>> +endobj +465 0 obj +<< +/K [2684 0 R 2685 0 R 2686 0 R 2687 0 R 25] +/P 73 0 R +/Pg 14 0 R +/S /TR +/Type /StructElem +>> +endobj +466 0 obj +<< +/K [2688 0 R 2689 0 R 2690 0 R 2691 0 R] +/P 73 0 R +/S /TR +/Type /StructElem +>> +endobj +467 0 obj +<< +/K [2692 0 R 2693 0 R 2694 0 R 2695 0 R 26] +/P 73 0 R +/Pg 14 0 R +/S /TR +/Type /StructElem +>> +endobj +468 0 obj +<< +/K [2696 0 R 2697 0 R 2698 0 R 2699 0 R] +/P 73 0 R +/S /TR +/Type /StructElem +>> +endobj +469 0 obj +<< +/K [2700 0 R 2701 0 R 2702 0 R 2703 0 R 27] +/P 73 0 R +/Pg 14 0 R +/S /TR +/Type /StructElem +>> +endobj +470 0 obj +<< +/K [2704 0 R 2705 0 R 2706 0 R 2707 0 R] +/P 73 0 R +/S /TR +/Type /StructElem +>> +endobj +471 0 obj +<< +/K [2708 0 R 2709 0 R 2710 0 R 2711 0 R 4] +/P 73 0 R +/Pg 15 0 R +/S /TR +/Type /StructElem +>> +endobj +472 0 obj +<< +/K [2712 0 R 2713 0 R 2714 0 R 2715 0 R] +/P 73 0 R +/S /TR +/Type /StructElem +>> +endobj +473 0 obj +<< +/K [2716 0 R 2717 0 R 2718 0 R 2719 0 R 5] +/P 73 0 R +/Pg 15 0 R +/S /TR +/Type /StructElem +>> +endobj +474 0 obj +<< +/K 47 +/P 74 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +475 0 obj +<< +/K [275 0 R 276 0 R 277 0 R] +/P 75 0 R +/S /TR +/Type /StructElem +>> +endobj +476 0 obj +<< +/K [2720 0 R 2721 0 R 2722 0 R] +/P 75 0 R +/S /TR +/Type /StructElem +>> +endobj +477 0 obj +<< +/K [2723 0 R 2724 0 R 2725 0 R 10] +/P 75 0 R +/Pg 15 0 R +/S /TR +/Type /StructElem +>> +endobj +478 0 obj +<< +/K [2726 0 R 2727 0 R 2728 0 R] +/P 75 0 R +/S /TR +/Type /StructElem +>> +endobj +479 0 obj +<< +/K [2729 0 R 2730 0 R 2731 0 R 11] +/P 75 0 R +/Pg 15 0 R +/S /TR +/Type /StructElem +>> +endobj +480 0 obj +<< +/K 63 +/P 77 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +481 0 obj +<< +/K 64 +/P 78 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +482 0 obj +<< +/K [1522 0 R 65] +/P 78 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +483 0 obj +<< +/K 67 +/P 78 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +484 0 obj +<< +/K 68 +/P 79 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +485 0 obj +<< +/K [278 0 R 279 0 R 280 0 R 1486 0 R] +/P 80 0 R +/S /TR +/Type /StructElem +>> +endobj +486 0 obj +<< +/K [2732 0 R 2733 0 R 2734 0 R] +/P 80 0 R +/S /TR +/Type /StructElem +>> +endobj +487 0 obj +<< +/K [2735 0 R 2736 0 R 2737 0 R 19] +/P 80 0 R +/Pg 15 0 R +/S /TR +/Type /StructElem +>> +endobj +488 0 obj +<< +/K [2738 0 R 2739 0 R 2740 0 R] +/P 80 0 R +/S /TR +/Type /StructElem +>> +endobj +489 0 obj +<< +/K [2741 0 R 2742 0 R 2743 0 R 20] +/P 80 0 R +/Pg 15 0 R +/S /TR +/Type /StructElem +>> +endobj +490 0 obj +<< +/K [2744 0 R 2745 0 R 2746 0 R] +/P 80 0 R +/S /TR +/Type /StructElem +>> +endobj +491 0 obj +<< +/K 95 +/P 81 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +492 0 obj +<< +/K [1549 0 R 1550 0 R 1551 0 R 1552 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R 1557 0 R 1558 0 R 1559 0 R 1560 0 R 1561 0 R 1562 0 R 1563 0 R 1564 0 R +1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R 1570 0 R 1571 0 R 1572 0 R 1573 0 R 1574 0 R 1575 0 R 1576 0 R 1577 0 R 1578 0 R 1579 0 R 1580 0 R +1581 0 R 1582 0 R 1583 0 R 1584 0 R 1585 0 R 1586 0 R 1587 0 R 1588 0 R 1589 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R 1594 0 R 1595 0 R 1596 0 R +1597 0 R 1598 0 R 1599 0 R 1600 0 R 1601 0 R 1602 0 R 1603 0 R 1604 0 R 1605 0 R 1606 0 R 1607 0 R 1608 0 R 1609 0 R 1610 0 R 1611 0 R 1612 0 R +1613 0 R 1614 0 R 1615 0 R 1616 0 R 1617 0 R 1618 0 R 1619 0 R 1620 0 R 1621 0 R 1622 0 R 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R +1629 0 R 1630 0 R 1631 0 R 1632 0 R 1633 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R 1639 0 R 1640 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R +1645 0 R 1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R 1658 0 R] +/P 82 0 R +/S /Code +/Type /StructElem +>> +endobj +493 0 obj +<< +/K 206 +/P 83 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +494 0 obj +<< +/K [1659 0 R 1660 0 R 1662 0 R] +/P 84 0 R +/S /LI +/Type /StructElem +>> +endobj +495 0 obj +<< +/K [1663 0 R 1664 0 R 1665 0 R 1667 0 R 1668 0 R 1670 0 R] +/P 84 0 R +/S /LI +/Type /StructElem +>> +endobj +496 0 obj +<< +/K [1671 0 R 1672 0 R] +/P 84 0 R +/S /LI +/Type /StructElem +>> +endobj +497 0 obj +<< +/K [1673 0 R 1674 0 R 1676 0 R] +/P 84 0 R +/S /LI +/Type /StructElem +>> +endobj +498 0 obj +<< +/K 6 +/P 86 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +499 0 obj +<< +/K 7 +/P 87 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +500 0 obj +<< +/K 8 +/P 88 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +501 0 obj +<< +/K [1677 0 R 9] +/P 88 0 R +/Pg 16 0 R +/S /Code +/Type /StructElem +>> +endobj +502 0 obj +<< +/K 11 +/P 88 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +503 0 obj +<< +/K [1678 0 R 12] +/P 88 0 R +/Pg 16 0 R +/S /Code +/Type /StructElem +>> +endobj +504 0 obj +<< +/K 14 +/P 88 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +505 0 obj +<< +/K 1679 0 R +/P 89 0 R +/S /Code +/Type /StructElem +>> +endobj +506 0 obj +<< +/K 16 +/P 90 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +507 0 obj +<< +/K 17 +/P 91 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +508 0 obj +<< +/K 18 +/P 93 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +509 0 obj +<< +/K 19 +/P 94 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +510 0 obj +<< +/K 20 +/P 95 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +511 0 obj +<< +/K 1680 0 R +/P 96 0 R +/S /Strong +/Type /StructElem +>> +endobj +512 0 obj +<< +/K 22 +/P 96 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +513 0 obj +<< +/K 1681 0 R +/P 96 0 R +/S /Strong +/Type /StructElem +>> +endobj +514 0 obj +<< +/K 24 +/P 96 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +515 0 obj +<< +/K [1682 0 R 25] +/P 96 0 R +/Pg 16 0 R +/S /Code +/Type /StructElem +>> +endobj +516 0 obj +<< +/K 27 +/P 96 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +517 0 obj +<< +/K [1683 0 R 28] +/P 96 0 R +/Pg 16 0 R +/S /Code +/Type /StructElem +>> +endobj +518 0 obj +<< +/K 30 +/P 96 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +519 0 obj +<< +/K [1684 0 R 31] +/P 96 0 R +/Pg 16 0 R +/S /Code +/Type /StructElem +>> +endobj +520 0 obj +<< +/K 33 +/P 96 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +521 0 obj +<< +/K 1685 0 R +/P 97 0 R +/S /Strong +/Type /StructElem +>> +endobj +522 0 obj +<< +/K 35 +/P 97 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +523 0 obj +<< +/K 36 +/P 98 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +524 0 obj +<< +/K 1686 0 R +/P 99 0 R +/S /Strong +/Type /StructElem +>> +endobj +525 0 obj +<< +/K 38 +/P 99 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +526 0 obj +<< +/K 1687 0 R +/P 99 0 R +/S /Strong +/Type /StructElem +>> +endobj +527 0 obj +<< +/K 40 +/P 99 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +528 0 obj +<< +/K [1688 0 R 41] +/P 99 0 R +/Pg 16 0 R +/S /Code +/Type /StructElem +>> +endobj +529 0 obj +<< +/K 43 +/P 99 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +530 0 obj +<< +/K 1689 0 R +/P 99 0 R +/S /Strong +/Type /StructElem +>> +endobj +531 0 obj +<< +/K 45 +/P 99 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +532 0 obj +<< +/K [1690 0 R 1691 0 R 1692 0 R 1693 0 R 1694 0 R 1695 0 R 1696 0 R 1697 0 R 1698 0 R 1699 0 R 1700 0 R 1701 0 R 1702 0 R 1703 0 R 1704 0 R 1705 0 R +1706 0 R 1707 0 R 1708 0 R 1709 0 R 1710 0 R 1711 0 R 1712 0 R 1713 0 R 1714 0 R 1715 0 R 1716 0 R 1717 0 R 1718 0 R 1719 0 R 1720 0 R 1721 0 R +1722 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R 1728 0 R 1729 0 R 1730 0 R 1731 0 R 1732 0 R 1733 0 R 1734 0 R] +/P 100 0 R +/S /Code +/Type /StructElem +>> +endobj +533 0 obj +<< +/K 1735 0 R +/P 101 0 R +/S /Strong +/Type /StructElem +>> +endobj +534 0 obj +<< +/K 92 +/P 101 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +535 0 obj +<< +/K 93 +/P 102 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +536 0 obj +<< +/K 1736 0 R +/P 103 0 R +/S /Strong +/Type /StructElem +>> +endobj +537 0 obj +<< +/K 95 +/P 103 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +538 0 obj +<< +/K 1737 0 R +/P 103 0 R +/S /Strong +/Type /StructElem +>> +endobj +539 0 obj +<< +/K 97 +/P 103 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +540 0 obj +<< +/K [1738 0 R 98] +/P 103 0 R +/Pg 16 0 R +/S /Code +/Type /StructElem +>> +endobj +541 0 obj +<< +/K 100 +/P 103 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +542 0 obj +<< +/K [1739 0 R 101] +/P 103 0 R +/Pg 16 0 R +/S /Code +/Type /StructElem +>> +endobj +543 0 obj +<< +/K 103 +/P 103 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +544 0 obj +<< +/K 1740 0 R +/P 104 0 R +/S /Strong +/Type /StructElem +>> +endobj +545 0 obj +<< +/K 105 +/P 104 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +546 0 obj +<< +/K [1741 0 R 106] +/P 104 0 R +/Pg 16 0 R +/S /Code +/Type /StructElem +>> +endobj +547 0 obj +<< +/K 108 +/P 104 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +548 0 obj +<< +/K [1742 0 R 109] +/P 104 0 R +/Pg 16 0 R +/S /Code +/Type /StructElem +>> +endobj +549 0 obj +<< +/K 3 +/P 105 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +550 0 obj +<< +/K 1743 0 R +/P 106 0 R +/S /Strong +/Type /StructElem +>> +endobj +551 0 obj +<< +/K 5 +/P 106 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +552 0 obj +<< +/K 1744 0 R +/P 106 0 R +/S /Strong +/Type /StructElem +>> +endobj +553 0 obj +<< +/K 7 +/P 106 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +554 0 obj +<< +/K [1745 0 R 8] +/P 106 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +555 0 obj +<< +/K 10 +/P 106 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +556 0 obj +<< +/K [1746 0 R 11] +/P 106 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +557 0 obj +<< +/K 13 +/P 106 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +558 0 obj +<< +/K [1747 0 R 14] +/P 106 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +559 0 obj +<< +/K 16 +/P 106 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +560 0 obj +<< +/K [1748 0 R 17] +/P 106 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +561 0 obj +<< +/K 19 +/P 106 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +562 0 obj +<< +/K 1749 0 R +/P 107 0 R +/S /Strong +/Type /StructElem +>> +endobj +563 0 obj +<< +/K 21 +/P 107 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +564 0 obj +<< +/K [1750 0 R 1751 0 R 1752 0 R 1753 0 R 1754 0 R 1755 0 R 1756 0 R 1757 0 R 1758 0 R 1759 0 R 1760 0 R 1761 0 R 1762 0 R 1763 0 R 1764 0 R 1765 0 R +1766 0 R 1767 0 R 1768 0 R 1769 0 R 1770 0 R 1771 0 R 1772 0 R 1773 0 R 1774 0 R 1775 0 R 1776 0 R 1777 0 R] +/P 108 0 R +/S /Code +/Type /StructElem +>> +endobj +565 0 obj +<< +/K 2747 0 R +/P 109 0 R +/S /P +/Type /StructElem +>> +endobj +566 0 obj +<< +/K 51 +/P 110 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +567 0 obj +<< +/K 1779 0 R +/P 110 0 R +/S /Strong +/Type /StructElem +>> +endobj +568 0 obj +<< +/K 53 +/P 111 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +569 0 obj +<< +/K 54 +/P 112 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +570 0 obj +<< +/K 55 +/P 113 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +571 0 obj +<< +/K 1780 0 R +/P 114 0 R +/S /Strong +/Type /StructElem +>> +endobj +572 0 obj +<< +/K 57 +/P 114 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +573 0 obj +<< +/K 1781 0 R +/P 114 0 R +/S /Strong +/Type /StructElem +>> +endobj +574 0 obj +<< +/K 59 +/P 114 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +575 0 obj +<< +/K [1782 0 R 60] +/P 114 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +576 0 obj +<< +/K 62 +/P 114 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +577 0 obj +<< +/K [1783 0 R 63] +/P 114 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +578 0 obj +<< +/K 65 +/P 115 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +579 0 obj +<< +/K 1784 0 R +/P 116 0 R +/S /Strong +/Type /StructElem +>> +endobj +580 0 obj +<< +/K 67 +/P 116 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +581 0 obj +<< +/K 1785 0 R +/P 116 0 R +/S /Strong +/Type /StructElem +>> +endobj +582 0 obj +<< +/K 69 +/P 116 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +583 0 obj +<< +/K [1786 0 R 70] +/P 116 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +584 0 obj +<< +/K 72 +/P 116 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +585 0 obj +<< +/K [1787 0 R 73] +/P 116 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +586 0 obj +<< +/K 75 +/P 116 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +587 0 obj +<< +/K 76 +/P 117 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +588 0 obj +<< +/K 1788 0 R +/P 118 0 R +/S /Strong +/Type /StructElem +>> +endobj +589 0 obj +<< +/K 78 +/P 118 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +590 0 obj +<< +/K 1789 0 R +/P 118 0 R +/S /Strong +/Type /StructElem +>> +endobj +591 0 obj +<< +/K 80 +/P 118 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +592 0 obj +<< +/K [1790 0 R 81] +/P 118 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +593 0 obj +<< +/K 83 +/P 118 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +594 0 obj +<< +/K 84 +/P 119 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +595 0 obj +<< +/K 1791 0 R +/P 120 0 R +/S /Strong +/Type /StructElem +>> +endobj +596 0 obj +<< +/K 86 +/P 120 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +597 0 obj +<< +/K 1792 0 R +/P 120 0 R +/S /Strong +/Type /StructElem +>> +endobj +598 0 obj +<< +/K 88 +/P 120 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +599 0 obj +<< +/K [1793 0 R 89] +/P 120 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +600 0 obj +<< +/K 91 +/P 120 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +601 0 obj +<< +/K 1794 0 R +/P 121 0 R +/S /Strong +/Type /StructElem +>> +endobj +602 0 obj +<< +/K 93 +/P 121 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +603 0 obj +<< +/K 94 +/P 122 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +604 0 obj +<< +/K 1795 0 R +/P 122 0 R +/S /Strong +/Type /StructElem +>> +endobj +605 0 obj +<< +/K 96 +/P 123 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +606 0 obj +<< +/K 97 +/P 124 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +607 0 obj +<< +/K 98 +/P 125 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +608 0 obj +<< +/K [1796 0 R 99] +/P 125 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +609 0 obj +<< +/K 101 +/P 125 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +610 0 obj +<< +/K 1797 0 R +/P 126 0 R +/S /Strong +/Type /StructElem +>> +endobj +611 0 obj +<< +/K 103 +/P 126 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +612 0 obj +<< +/K 104 +/P 127 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +613 0 obj +<< +/K 1798 0 R +/P 128 0 R +/S /Strong +/Type /StructElem +>> +endobj +614 0 obj +<< +/K 106 +/P 128 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +615 0 obj +<< +/K 1799 0 R +/P 128 0 R +/S /Strong +/Type /StructElem +>> +endobj +616 0 obj +<< +/K 108 +/P 128 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +617 0 obj +<< +/K [1800 0 R 109] +/P 128 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +618 0 obj +<< +/K 111 +/P 128 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +619 0 obj +<< +/K [1801 0 R 112] +/P 128 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +620 0 obj +<< +/K 114 +/P 128 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +621 0 obj +<< +/K [1802 0 R 115] +/P 128 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +622 0 obj +<< +/K 117 +/P 128 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +623 0 obj +<< +/K [1803 0 R 118] +/P 128 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +624 0 obj +<< +/K 120 +/P 128 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +625 0 obj +<< +/K [1804 0 R 121] +/P 128 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +626 0 obj +<< +/K 123 +/P 128 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +627 0 obj +<< +/K 124 +/P 129 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +628 0 obj +<< +/K 1805 0 R +/P 130 0 R +/S /Strong +/Type /StructElem +>> +endobj +629 0 obj +<< +/K 126 +/P 130 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +630 0 obj +<< +/K 1806 0 R +/P 130 0 R +/S /Strong +/Type /StructElem +>> +endobj +631 0 obj +<< +/K 128 +/P 130 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +632 0 obj +<< +/K [1807 0 R 129] +/P 130 0 R +/Pg 17 0 R +/S /Code +/Type /StructElem +>> +endobj +633 0 obj +<< +/K 131 +/P 130 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +634 0 obj +<< +/K 11 +/P 132 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +635 0 obj +<< +/K 12 +/P 133 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +636 0 obj +<< +/K [281 0 R 282 0 R 283 0 R] +/P 134 0 R +/S /TR +/Type /StructElem +>> +endobj +637 0 obj +<< +/K [2748 0 R 2749 0 R 2750 0 R] +/P 134 0 R +/S /TR +/Type /StructElem +>> +endobj +638 0 obj +<< +/K [2751 0 R 2752 0 R 2753 0 R 4] +/P 134 0 R +/Pg 18 0 R +/S /TR +/Type /StructElem +>> +endobj +639 0 obj +<< +/K [2754 0 R 2755 0 R 2756 0 R] +/P 134 0 R +/S /TR +/Type /StructElem +>> +endobj +640 0 obj +<< +/K [2757 0 R 2758 0 R 2759 0 R 5] +/P 134 0 R +/Pg 18 0 R +/S /TR +/Type /StructElem +>> +endobj +641 0 obj +<< +/K [2760 0 R 2761 0 R 2762 0 R] +/P 134 0 R +/S /TR +/Type /StructElem +>> +endobj +642 0 obj +<< +/K 31 +/P 135 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +643 0 obj +<< +/K 32 +/P 136 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +644 0 obj +<< +/K 1826 0 R +/P 137 0 R +/S /Strong +/Type /StructElem +>> +endobj +645 0 obj +<< +/K 34 +/P 137 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +646 0 obj +<< +/K 1827 0 R +/P 137 0 R +/S /Strong +/Type /StructElem +>> +endobj +647 0 obj +<< +/K 36 +/P 137 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +648 0 obj +<< +/K 1828 0 R +/P 137 0 R +/S /Strong +/Type /StructElem +>> +endobj +649 0 obj +<< +/K 38 +/P 137 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +650 0 obj +<< +/K [1829 0 R 39] +/P 137 0 R +/Pg 18 0 R +/S /Code +/Type /StructElem +>> +endobj +651 0 obj +<< +/K 41 +/P 137 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +652 0 obj +<< +/K [1830 0 R 1831 0 R 1832 0 R 1833 0 R 1834 0 R] +/P 138 0 R +/S /Code +/Type /StructElem +>> +endobj +653 0 obj +<< +/K 47 +/P 139 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +654 0 obj +<< +/K 1835 0 R +/P 140 0 R +/S /Strong +/Type /StructElem +>> +endobj +655 0 obj +<< +/K 49 +/P 140 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +656 0 obj +<< +/K 1836 0 R +/P 140 0 R +/S /Strong +/Type /StructElem +>> +endobj +657 0 obj +<< +/K 51 +/P 140 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +658 0 obj +<< +/K [1837 0 R 52] +/P 140 0 R +/Pg 18 0 R +/S /Code +/Type /StructElem +>> +endobj +659 0 obj +<< +/K 54 +/P 140 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +660 0 obj +<< +/K 1838 0 R +/P 140 0 R +/S /Strong +/Type /StructElem +>> +endobj +661 0 obj +<< +/K 56 +/P 140 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +662 0 obj +<< +/K [1839 0 R 57] +/P 140 0 R +/Pg 18 0 R +/S /Code +/Type /StructElem +>> +endobj +663 0 obj +<< +/K 59 +/P 140 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +664 0 obj +<< +/K [1840 0 R 1841 0 R 1842 0 R 1843 0 R 1844 0 R 1845 0 R 1846 0 R] +/P 141 0 R +/S /Code +/Type /StructElem +>> +endobj +665 0 obj +<< +/K 67 +/P 142 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +666 0 obj +<< +/K 1847 0 R +/P 143 0 R +/S /Strong +/Type /StructElem +>> +endobj +667 0 obj +<< +/K 69 +/P 143 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +668 0 obj +<< +/K 1848 0 R +/P 143 0 R +/S /Strong +/Type /StructElem +>> +endobj +669 0 obj +<< +/K 71 +/P 143 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +670 0 obj +<< +/K [1849 0 R 72] +/P 143 0 R +/Pg 18 0 R +/S /Code +/Type /StructElem +>> +endobj +671 0 obj +<< +/K 74 +/P 143 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +672 0 obj +<< +/K 1850 0 R +/P 143 0 R +/S /Strong +/Type /StructElem +>> +endobj +673 0 obj +<< +/K 76 +/P 143 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +674 0 obj +<< +/K [1851 0 R 1852 0 R 1853 0 R 1854 0 R 1855 0 R 1856 0 R 1857 0 R 1858 0 R 1859 0 R 1860 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1865 0 R 1866 0 R +1867 0 R 1868 0 R 1869 0 R 1870 0 R 1871 0 R 1872 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R +1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R] +/P 144 0 R +/S /Code +/Type /StructElem +>> +endobj +675 0 obj +<< +/K 118 +/P 145 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +676 0 obj +<< +/K 1892 0 R +/P 146 0 R +/S /Strong +/Type /StructElem +>> +endobj +677 0 obj +<< +/K 120 +/P 146 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +678 0 obj +<< +/K 1893 0 R +/P 146 0 R +/S /Strong +/Type /StructElem +>> +endobj +679 0 obj +<< +/K 122 +/P 146 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +680 0 obj +<< +/K [1894 0 R 123] +/P 146 0 R +/Pg 18 0 R +/S /Code +/Type /StructElem +>> +endobj +681 0 obj +<< +/K 125 +/P 146 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +682 0 obj +<< +/K 1895 0 R +/P 146 0 R +/S /Strong +/Type /StructElem +>> +endobj +683 0 obj +<< +/K 127 +/P 146 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +684 0 obj +<< +/K 1896 0 R +/P 146 0 R +/S /Strong +/Type /StructElem +>> +endobj +685 0 obj +<< +/K 129 +/P 146 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +686 0 obj +<< +/K [1897 0 R 1898 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R] +/P 147 0 R +/S /Code +/Type /StructElem +>> +endobj +687 0 obj +<< +/K 10 +/P 148 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +688 0 obj +<< +/K 1903 0 R +/P 149 0 R +/S /Strong +/Type /StructElem +>> +endobj +689 0 obj +<< +/K 12 +/P 149 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +690 0 obj +<< +/K 1904 0 R +/P 150 0 R +/S /Strong +/Type /StructElem +>> +endobj +691 0 obj +<< +/K 14 +/P 150 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +692 0 obj +<< +/K [1905 0 R 15] +/P 150 0 R +/Pg 19 0 R +/S /Code +/Type /StructElem +>> +endobj +693 0 obj +<< +/K 17 +/P 150 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +694 0 obj +<< +/K [1906 0 R 18] +/P 150 0 R +/Pg 19 0 R +/S /Code +/Type /StructElem +>> +endobj +695 0 obj +<< +/K 20 +/P 150 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +696 0 obj +<< +/K 1907 0 R +/P 151 0 R +/S /Code +/Type /StructElem +>> +endobj +697 0 obj +<< +/K 1908 0 R +/P 152 0 R +/S /Strong +/Type /StructElem +>> +endobj +698 0 obj +<< +/K 1909 0 R +/P 153 0 R +/S /Strong +/Type /StructElem +>> +endobj +699 0 obj +<< +/K [284 0 R 285 0 R 286 0 R 287 0 R] +/P 154 0 R +/S /TR +/Type /StructElem +>> +endobj +700 0 obj +<< +/K [2763 0 R 2764 0 R 2765 0 R 2766 0 R] +/P 154 0 R +/S /TR +/Type /StructElem +>> +endobj +701 0 obj +<< +/K [2767 0 R 2768 0 R 2769 0 R 2770 0 R 5] +/P 154 0 R +/Pg 19 0 R +/S /TR +/Type /StructElem +>> +endobj +702 0 obj +<< +/K [2771 0 R 2772 0 R 2773 0 R 2774 0 R] +/P 154 0 R +/S /TR +/Type /StructElem +>> +endobj +703 0 obj +<< +/K [2775 0 R 2776 0 R 2777 0 R 2778 0 R 6] +/P 154 0 R +/Pg 19 0 R +/S /TR +/Type /StructElem +>> +endobj +704 0 obj +<< +/K 1935 0 R +/P 155 0 R +/S /Strong +/Type /StructElem +>> +endobj +705 0 obj +<< +/K 50 +/P 155 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +706 0 obj +<< +/K 1936 0 R +/P 156 0 R +/S /Strong +/Type /StructElem +>> +endobj +707 0 obj +<< +/K [1937 0 R 52] +/P 157 0 R +/Pg 19 0 R +/S /Code +/Type /StructElem +>> +endobj +708 0 obj +<< +/K 54 +/P 157 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +709 0 obj +<< +/K [1938 0 R 55] +/P 157 0 R +/Pg 19 0 R +/S /Code +/Type /StructElem +>> +endobj +710 0 obj +<< +/K 57 +/P 157 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +711 0 obj +<< +/K [1939 0 R 58] +/P 157 0 R +/Pg 19 0 R +/S /Code +/Type /StructElem +>> +endobj +712 0 obj +<< +/K 60 +/P 157 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +713 0 obj +<< +/K [1940 0 R 1941 0 R 1942 0 R 1943 0 R 1944 0 R 1945 0 R 1946 0 R 1947 0 R 1948 0 R 1949 0 R 1950 0 R 1951 0 R 1952 0 R 1953 0 R 1954 0 R 1955 0 R] +/P 158 0 R +/S /Code +/Type /StructElem +>> +endobj +714 0 obj +<< +/K 77 +/P 159 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +715 0 obj +<< +/K 1956 0 R +/P 160 0 R +/S /Strong +/Type /StructElem +>> +endobj +716 0 obj +<< +/K 79 +/P 161 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +717 0 obj +<< +/K [1957 0 R 80] +/P 161 0 R +/Pg 19 0 R +/S /Code +/Type /StructElem +>> +endobj +718 0 obj +<< +/K 82 +/P 161 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +719 0 obj +<< +/K [1958 0 R 1959 0 R 1960 0 R 1961 0 R 1962 0 R 1963 0 R 1964 0 R 1965 0 R 1966 0 R 1967 0 R 1968 0 R 1969 0 R 1970 0 R 1971 0 R 1972 0 R 1973 0 R +1974 0 R 1975 0 R 1976 0 R 1977 0 R 1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R 1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R 1988 0 R 1989 0 R +1990 0 R 1991 0 R 1992 0 R 1993 0 R 1994 0 R 1995 0 R 1996 0 R 1997 0 R 1998 0 R 1999 0 R 2000 0 R 2001 0 R 2002 0 R 2003 0 R 2004 0 R 2005 0 R +2006 0 R 2007 0 R 2008 0 R 2009 0 R 2010 0 R 2011 0 R 2012 0 R 2013 0 R 2014 0 R 2015 0 R 2016 0 R 2017 0 R 2018 0 R 2019 0 R 2020 0 R] +/P 162 0 R +/S /Code +/Type /StructElem +>> +endobj +720 0 obj +<< +/K 18 +/P 163 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +721 0 obj +<< +/K [2021 0 R 19] +/P 163 0 R +/Pg 20 0 R +/S /Code +/Type /StructElem +>> +endobj +722 0 obj +<< +/K 21 +/P 163 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +723 0 obj +<< +/K 2022 0 R +/P 163 0 R +/S /Strong +/Type /StructElem +>> +endobj +724 0 obj +<< +/K 23 +/P 163 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +725 0 obj +<< +/K 2023 0 R +/P 164 0 R +/S /Strong +/Type /StructElem +>> +endobj +726 0 obj +<< +/K [2024 0 R 25] +/P 165 0 R +/Pg 20 0 R +/S /Code +/Type /StructElem +>> +endobj +727 0 obj +<< +/K 27 +/P 165 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +728 0 obj +<< +/K [2025 0 R 2026 0 R 2027 0 R 2028 0 R 2029 0 R 2030 0 R 2031 0 R 2032 0 R 2033 0 R 2034 0 R 2035 0 R 2036 0 R 2037 0 R 2038 0 R 2039 0 R 2040 0 R +2041 0 R 2042 0 R 2043 0 R 2044 0 R 2045 0 R 2046 0 R 2047 0 R 2048 0 R 2049 0 R 2050 0 R 2051 0 R 2052 0 R 2053 0 R 2054 0 R 2055 0 R 2056 0 R +2057 0 R 2058 0 R 2059 0 R 2060 0 R 2061 0 R 2062 0 R 2063 0 R 2064 0 R 2065 0 R 2066 0 R 2067 0 R 2068 0 R 2069 0 R 2070 0 R 2071 0 R 2072 0 R +2073 0 R 2074 0 R 2075 0 R 2076 0 R 2077 0 R 2078 0 R 2079 0 R 2080 0 R 2081 0 R 2082 0 R 2083 0 R 2084 0 R 2085 0 R] +/P 166 0 R +/S /Code +/Type /StructElem +>> +endobj +729 0 obj +<< +/K 89 +/P 167 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +730 0 obj +<< +/K 90 +/P 168 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +731 0 obj +<< +/K 91 +/P 169 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +732 0 obj +<< +/K 2086 0 R +/P 170 0 R +/S /Strong +/Type /StructElem +>> +endobj +733 0 obj +<< +/K 93 +/P 170 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +734 0 obj +<< +/K 2087 0 R +/P 170 0 R +/S /Strong +/Type /StructElem +>> +endobj +735 0 obj +<< +/K 95 +/P 170 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +736 0 obj +<< +/K 2088 0 R +/P 170 0 R +/S /Strong +/Type /StructElem +>> +endobj +737 0 obj +<< +/K 97 +/P 170 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +738 0 obj +<< +/K [2089 0 R 98] +/P 170 0 R +/Pg 20 0 R +/S /Code +/Type /StructElem +>> +endobj +739 0 obj +<< +/K 100 +/P 170 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +740 0 obj +<< +/K 2090 0 R +/P 170 0 R +/S /Strong +/Type /StructElem +>> +endobj +741 0 obj +<< +/K 102 +/P 170 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +742 0 obj +<< +/K [2091 0 R 103] +/P 170 0 R +/Pg 20 0 R +/S /Code +/Type /StructElem +>> +endobj +743 0 obj +<< +/K 105 +/P 170 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +744 0 obj +<< +/K 106 +/P 171 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +745 0 obj +<< +/K [288 0 R 289 0 R 290 0 R] +/P 172 0 R +/S /TR +/Type /StructElem +>> +endobj +746 0 obj +<< +/K [2779 0 R 2780 0 R 2781 0 R] +/P 172 0 R +/S /TR +/Type /StructElem +>> +endobj +747 0 obj +<< +/K [2782 0 R 2783 0 R 2784 0 R 5] +/P 172 0 R +/Pg 20 0 R +/S /TR +/Type /StructElem +>> +endobj +748 0 obj +<< +/K [2785 0 R 2786 0 R 2787 0 R] +/P 172 0 R +/S /TR +/Type /StructElem +>> +endobj +749 0 obj +<< +/K [2788 0 R 2789 0 R 2790 0 R 6] +/P 172 0 R +/Pg 20 0 R +/S /TR +/Type /StructElem +>> +endobj +750 0 obj +<< +/K [2791 0 R 2792 0 R 2793 0 R] +/P 172 0 R +/S /TR +/Type /StructElem +>> +endobj +751 0 obj +<< +/K [2794 0 R 2795 0 R 2796 0 R 7] +/P 172 0 R +/Pg 20 0 R +/S /TR +/Type /StructElem +>> +endobj +752 0 obj +<< +/K [2797 0 R 2798 0 R 2799 0 R] +/P 172 0 R +/S /TR +/Type /StructElem +>> +endobj +753 0 obj +<< +/K [2800 0 R 2801 0 R 2802 0 R 8] +/P 172 0 R +/Pg 20 0 R +/S /TR +/Type /StructElem +>> +endobj +754 0 obj +<< +/K [2803 0 R 2804 0 R 2805 0 R] +/P 172 0 R +/S /TR +/Type /StructElem +>> +endobj +755 0 obj +<< +/K 137 +/P 174 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +756 0 obj +<< +/K 138 +/P 175 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +757 0 obj +<< +/K 139 +/P 176 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +758 0 obj +<< +/K 140 +/P 177 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +759 0 obj +<< +/K [2122 0 R 141] +/P 177 0 R +/Pg 20 0 R +/S /Code +/Type /StructElem +>> +endobj +760 0 obj +<< +/K 143 +/P 177 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +761 0 obj +<< +/K 144 +/P 178 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +762 0 obj +<< +/K 145 +/P 179 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +763 0 obj +<< +/K [2123 0 R 146] +/P 179 0 R +/Pg 20 0 R +/S /Code +/Type /StructElem +>> +endobj +764 0 obj +<< +/K 148 +/P 179 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +765 0 obj +<< +/K [2124 0 R 149] +/P 179 0 R +/Pg 20 0 R +/S /Code +/Type /StructElem +>> +endobj +766 0 obj +<< +/K 151 +/P 179 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +767 0 obj +<< +/K 152 +/P 180 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +768 0 obj +<< +/K 153 +/P 181 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +769 0 obj +<< +/K [2125 0 R 154] +/P 181 0 R +/Pg 20 0 R +/S /Code +/Type /StructElem +>> +endobj +770 0 obj +<< +/K 156 +/P 181 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +771 0 obj +<< +/K 27 +/P 182 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +772 0 obj +<< +/K [2126 0 R 28] +/P 183 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +773 0 obj +<< +/K 30 +/P 183 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +774 0 obj +<< +/K [2127 0 R 31] +/P 183 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +775 0 obj +<< +/K 33 +/P 183 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +776 0 obj +<< +/K [2128 0 R 34] +/P 183 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +777 0 obj +<< +/K 36 +/P 183 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +778 0 obj +<< +/K [2129 0 R 37] +/P 183 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +779 0 obj +<< +/K 39 +/P 183 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +780 0 obj +<< +/K [2130 0 R 40] +/P 183 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +781 0 obj +<< +/K 42 +/P 183 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +782 0 obj +<< +/K 43 +/P 184 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +783 0 obj +<< +/K [2131 0 R 2132 0 R 2134 0 R 2135 0 R 2137 0 R] +/P 185 0 R +/S /LI +/Type /StructElem +>> +endobj +784 0 obj +<< +/K [2138 0 R 2139 0 R 2141 0 R 2142 0 R 2144 0 R] +/P 185 0 R +/S /LI +/Type /StructElem +>> +endobj +785 0 obj +<< +/K [2145 0 R 2146 0 R 2148 0 R] +/P 185 0 R +/S /LI +/Type /StructElem +>> +endobj +786 0 obj +<< +/K [2149 0 R 2150 0 R 2151 0 R 2153 0 R 2154 0 R 2156 0 R 2157 0 R 2159 0 R] +/P 185 0 R +/S /LI +/Type /StructElem +>> +endobj +787 0 obj +<< +/K 73 +/P 186 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +788 0 obj +<< +/K [291 0 R 292 0 R 293 0 R] +/P 187 0 R +/S /TR +/Type /StructElem +>> +endobj +789 0 obj +<< +/K [2806 0 R 2807 0 R 2808 0 R] +/P 187 0 R +/S /TR +/Type /StructElem +>> +endobj +790 0 obj +<< +/K [2809 0 R 2810 0 R 2811 0 R 3] +/P 187 0 R +/Pg 21 0 R +/S /TR +/Type /StructElem +>> +endobj +791 0 obj +<< +/K [2812 0 R 2813 0 R 2814 0 R] +/P 187 0 R +/S /TR +/Type /StructElem +>> +endobj +792 0 obj +<< +/K [2815 0 R 2816 0 R 2817 0 R 4] +/P 187 0 R +/Pg 21 0 R +/S /TR +/Type /StructElem +>> +endobj +793 0 obj +<< +/K 89 +/P 189 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +794 0 obj +<< +/K 90 +/P 190 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +795 0 obj +<< +/K [294 0 R 295 0 R 296 0 R 297 0 R] +/P 191 0 R +/S /TR +/Type /StructElem +>> +endobj +796 0 obj +<< +/K [2818 0 R 2819 0 R 2820 0 R 2821 0 R] +/P 191 0 R +/S /TR +/Type /StructElem +>> +endobj +797 0 obj +<< +/K [2822 0 R 2823 0 R 2824 0 R 2825 0 R 12] +/P 191 0 R +/Pg 21 0 R +/S /TR +/Type /StructElem +>> +endobj +798 0 obj +<< +/K [2826 0 R 2827 0 R 2828 0 R 2829 0 R] +/P 191 0 R +/S /TR +/Type /StructElem +>> +endobj +799 0 obj +<< +/K [2830 0 R 2831 0 R 2832 0 R 2833 0 R 13] +/P 191 0 R +/Pg 21 0 R +/S /TR +/Type /StructElem +>> +endobj +800 0 obj +<< +/K 111 +/P 192 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +801 0 obj +<< +/K [298 0 R 299 0 R 300 0 R] +/P 193 0 R +/S /TR +/Type /StructElem +>> +endobj +802 0 obj +<< +/K [2834 0 R 2835 0 R 2836 0 R] +/P 193 0 R +/S /TR +/Type /StructElem +>> +endobj +803 0 obj +<< +/K [2837 0 R 2838 0 R 2839 0 R 18] +/P 193 0 R +/Pg 21 0 R +/S /TR +/Type /StructElem +>> +endobj +804 0 obj +<< +/K [2840 0 R 2841 0 R 2842 0 R] +/P 193 0 R +/S /TR +/Type /StructElem +>> +endobj +805 0 obj +<< +/K [2843 0 R 2844 0 R 2845 0 R 19] +/P 193 0 R +/Pg 21 0 R +/S /TR +/Type /StructElem +>> +endobj +806 0 obj +<< +/K [2846 0 R 2847 0 R 2848 0 R] +/P 193 0 R +/S /TR +/Type /StructElem +>> +endobj +807 0 obj +<< +/K [2849 0 R 2850 0 R 2851 0 R 20] +/P 193 0 R +/Pg 21 0 R +/S /TR +/Type /StructElem +>> +endobj +808 0 obj +<< +/K [2852 0 R 2853 0 R 2854 0 R] +/P 193 0 R +/S /TR +/Type /StructElem +>> +endobj +809 0 obj +<< +/K 136 +/P 194 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +810 0 obj +<< +/K [301 0 R 302 0 R 303 0 R] +/P 195 0 R +/S /TR +/Type /StructElem +>> +endobj +811 0 obj +<< +/K [2855 0 R 2856 0 R 2857 0 R] +/P 195 0 R +/S /TR +/Type /StructElem +>> +endobj +812 0 obj +<< +/K [2858 0 R 2859 0 R 2860 0 R 25] +/P 195 0 R +/Pg 21 0 R +/S /TR +/Type /StructElem +>> +endobj +813 0 obj +<< +/K [2861 0 R 2862 0 R 2863 0 R] +/P 195 0 R +/S /TR +/Type /StructElem +>> +endobj +814 0 obj +<< +/K [2864 0 R 2865 0 R 2866 0 R 3] +/P 195 0 R +/Pg 22 0 R +/S /TR +/Type /StructElem +>> +endobj +815 0 obj +<< +/K [2867 0 R 2868 0 R 2869 0 R] +/P 195 0 R +/S /TR +/Type /StructElem +>> +endobj +816 0 obj +<< +/K [2870 0 R 2871 0 R 2872 0 R 4] +/P 195 0 R +/Pg 22 0 R +/S /TR +/Type /StructElem +>> +endobj +817 0 obj +<< +/K 30 +/P 196 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +818 0 obj +<< +/K [304 0 R 305 0 R] +/P 197 0 R +/S /TR +/Type /StructElem +>> +endobj +819 0 obj +<< +/K [2873 0 R 2874 0 R] +/P 197 0 R +/S /TR +/Type /StructElem +>> +endobj +820 0 obj +<< +/K [2875 0 R 2876 0 R 8] +/P 197 0 R +/Pg 22 0 R +/S /TR +/Type /StructElem +>> +endobj +821 0 obj +<< +/K [2877 0 R 2878 0 R] +/P 197 0 R +/S /TR +/Type /StructElem +>> +endobj +822 0 obj +<< +/K [2879 0 R 2880 0 R 9] +/P 197 0 R +/Pg 22 0 R +/S /TR +/Type /StructElem +>> +endobj +823 0 obj +<< +/K 41 +/P 199 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +824 0 obj +<< +/K 42 +/P 200 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +825 0 obj +<< +/K 2250 0 R +/P 201 0 R +/S /Code +/Type /StructElem +>> +endobj +826 0 obj +<< +/K 44 +/P 202 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +827 0 obj +<< +/K 2251 0 R +/P 203 0 R +/S /Code +/Type /StructElem +>> +endobj +828 0 obj +<< +/K 2 +/P 204 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +829 0 obj +<< +/K [2252 0 R 2253 0 R 2254 0 R 2255 0 R 2256 0 R 2257 0 R 2258 0 R 2259 0 R 2260 0 R 2261 0 R 2262 0 R 2263 0 R 2264 0 R 2265 0 R 2266 0 R 2267 0 R +2268 0 R 2269 0 R 2270 0 R 2271 0 R 2272 0 R 2273 0 R 2274 0 R 2275 0 R 2276 0 R 2277 0 R 2278 0 R 2279 0 R 2280 0 R 2281 0 R 2282 0 R 2283 0 R +2284 0 R 2285 0 R 2286 0 R 2287 0 R 2288 0 R 2289 0 R 2290 0 R 2291 0 R 2292 0 R 2293 0 R 2294 0 R 2295 0 R 2296 0 R 2297 0 R 2298 0 R 2299 0 R +2300 0 R 2301 0 R 2302 0 R 2303 0 R 2304 0 R 2305 0 R 2306 0 R 2307 0 R 2308 0 R 2309 0 R 2310 0 R 2311 0 R 2312 0 R 2313 0 R 2314 0 R 2315 0 R +2316 0 R 2317 0 R 2318 0 R 2319 0 R 2320 0 R 2321 0 R 2322 0 R 2323 0 R 2324 0 R 2325 0 R 2326 0 R 2327 0 R 2328 0 R 2329 0 R 2330 0 R 2331 0 R +2332 0 R 2333 0 R 2334 0 R 2335 0 R 2336 0 R 2337 0 R 2338 0 R 2339 0 R 2340 0 R 2341 0 R 2342 0 R 2343 0 R 2344 0 R 2345 0 R 2346 0 R 2347 0 R +2348 0 R 2349 0 R 2350 0 R 2351 0 R 2352 0 R 2353 0 R 2354 0 R 2355 0 R 2356 0 R 2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R 2363 0 R +2364 0 R 2365 0 R 2366 0 R 2367 0 R 2368 0 R 2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R 2374 0 R 2375 0 R 2376 0 R 2377 0 R 2378 0 R 2379 0 R +2380 0 R 2381 0 R 2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R 2387 0 R 2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R 2393 0 R 2394 0 R 2395 0 R +2396 0 R 2397 0 R 2398 0 R] +/P 205 0 R +/S /Code +/Type /StructElem +>> +endobj +830 0 obj +<< +/K 150 +/P 206 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +831 0 obj +<< +/K [2399 0 R 2400 0 R 2401 0 R 2402 0 R 2403 0 R 2404 0 R 2405 0 R 2406 0 R 2407 0 R 2408 0 R 2409 0 R 2410 0 R 2411 0 R 2412 0 R 2413 0 R 2414 0 R +2415 0 R 2416 0 R 2417 0 R 2418 0 R 2419 0 R 2420 0 R 2421 0 R 2422 0 R 2423 0 R 2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R 2429 0 R 2430 0 R +2431 0 R 2432 0 R 2433 0 R 2434 0 R 2435 0 R 2436 0 R 2437 0 R 2438 0 R 2439 0 R 2440 0 R 2441 0 R 2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R +2447 0 R 2448 0 R 2449 0 R 2450 0 R 2451 0 R 2452 0 R 2453 0 R] +/P 207 0 R +/S /Code +/Type /StructElem +>> +endobj +832 0 obj +<< +/K 24 +/P 2482 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +833 0 obj +<< +/K 25 +/P 307 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +834 0 obj +<< +/K 26 +/P 2483 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +835 0 obj +<< +/K 27 +/P 307 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +836 0 obj +<< +/K 28 +/P 2484 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +837 0 obj +<< +/K 29 +/P 307 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +838 0 obj +<< +/K 30 +/P 2485 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +839 0 obj +<< +/K 31 +/P 307 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +840 0 obj +<< +/K 33 +/P 309 0 R +/Pg 11 0 R +/S /Lbl +/Type /StructElem +>> +endobj +841 0 obj +<< +/K 34 +/P 2486 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +842 0 obj +<< +/K 35 +/P 310 0 R +/Pg 11 0 R +/S /Lbl +/Type /StructElem +>> +endobj +843 0 obj +<< +/K 36 +/P 2487 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +844 0 obj +<< +/K 37 +/P 311 0 R +/Pg 11 0 R +/S /Lbl +/Type /StructElem +>> +endobj +845 0 obj +<< +/K 38 +/P 2488 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +846 0 obj +<< +/K 39 +/P 312 0 R +/Pg 11 0 R +/S /Lbl +/Type /StructElem +>> +endobj +847 0 obj +<< +/K 40 +/P 2489 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +848 0 obj +<< +/K 41 +/P 313 0 R +/Pg 11 0 R +/S /Lbl +/Type /StructElem +>> +endobj +849 0 obj +<< +/K 42 +/P 2490 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +850 0 obj +<< +/K 43 +/P 314 0 R +/Pg 11 0 R +/S /Lbl +/Type /StructElem +>> +endobj +851 0 obj +<< +/K 44 +/P 2491 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +852 0 obj +<< +/K 45 +/P 315 0 R +/Pg 11 0 R +/S /Lbl +/Type /StructElem +>> +endobj +853 0 obj +<< +/K 46 +/P 2492 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +854 0 obj +<< +/K 47 +/P 316 0 R +/Pg 11 0 R +/S /Lbl +/Type /StructElem +>> +endobj +855 0 obj +<< +/K 48 +/P 2493 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +856 0 obj +<< +/K 52 +/P 320 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +857 0 obj +<< +/K 54 +/P 322 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +858 0 obj +<< +/K 56 +/P 324 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +859 0 obj +<< +/K 58 +/P 326 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +860 0 obj +<< +/K 60 +/P 328 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +861 0 obj +<< +/K 62 +/P 330 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +862 0 obj +<< +/K 64 +/P 332 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +863 0 obj +<< +/K 66 +/P 334 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +864 0 obj +<< +/K 68 +/P 336 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +865 0 obj +<< +/K 70 +/P 338 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +866 0 obj +<< +/K 72 +/P 340 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +867 0 obj +<< +/K 75 +/P 245 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +868 0 obj +<< +/K 76 +/P 246 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +869 0 obj +<< +/K 77 +/P 247 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +870 0 obj +<< +/K 78 +/P 248 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +871 0 obj +<< +/K 79 +/P 249 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +872 0 obj +<< +/K [873 0 R 80] +/P 2494 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +873 0 obj +<< +/K 81 +/P 872 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +874 0 obj +<< +/K 82 +/P 2495 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +875 0 obj +<< +/K 83 +/P 2496 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +876 0 obj +<< +/K 84 +/P 2881 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +877 0 obj +<< +/K 85 +/P 2498 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +878 0 obj +<< +/K [879 0 R 86] +/P 2499 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +879 0 obj +<< +/K 87 +/P 878 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +880 0 obj +<< +/K 88 +/P 2500 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +881 0 obj +<< +/K 89 +/P 2501 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +882 0 obj +<< +/K 90 +/P 2882 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +883 0 obj +<< +/K 91 +/P 2503 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +884 0 obj +<< +/K [885 0 R 92] +/P 2504 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +885 0 obj +<< +/K 93 +/P 884 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +886 0 obj +<< +/K 94 +/P 2505 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +887 0 obj +<< +/K 95 +/P 2506 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +888 0 obj +<< +/K 96 +/P 2883 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +889 0 obj +<< +/K 97 +/P 2508 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +890 0 obj +<< +/K [891 0 R 98] +/P 2509 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +891 0 obj +<< +/K 99 +/P 890 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +892 0 obj +<< +/K 100 +/P 2510 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +893 0 obj +<< +/K 101 +/P 2511 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +894 0 obj +<< +/K 102 +/P 2884 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +895 0 obj +<< +/K 103 +/P 2513 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +896 0 obj +<< +/K [897 0 R 104] +/P 2514 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +897 0 obj +<< +/K 105 +/P 896 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +898 0 obj +<< +/K 106 +/P 2515 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +899 0 obj +<< +/K 107 +/P 2516 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +900 0 obj +<< +/K 108 +/P 2885 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +901 0 obj +<< +/K 109 +/P 2518 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +902 0 obj +<< +/K [903 0 R 110] +/P 2519 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +903 0 obj +<< +/K 111 +/P 902 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +904 0 obj +<< +/K 112 +/P 2520 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +905 0 obj +<< +/K 113 +/P 2521 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +906 0 obj +<< +/K 114 +/P 2886 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +907 0 obj +<< +/K 115 +/P 2523 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +908 0 obj +<< +/K [117 << +/MCID 19 +/Pg 12 0 R +/Type /MCR +>>] +/P 250 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +909 0 obj +<< +/K [118 << +/MCID 20 +/Pg 12 0 R +/Type /MCR +>>] +/P 251 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +910 0 obj +<< +/K [119 << +/MCID 21 +/Pg 12 0 R +/Type /MCR +>>] +/P 252 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +911 0 obj +<< +/K [120 << +/MCID 22 +/Pg 12 0 R +/Type /MCR +>>] +/P 253 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +912 0 obj +<< +/K [913 0 R 121] +/P 2524 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +913 0 obj +<< +/K 122 +/P 912 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +914 0 obj +<< +/K 123 +/P 2525 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +915 0 obj +<< +/K 124 +/P 2887 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +916 0 obj +<< +/K 125 +/P 2527 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +917 0 obj +<< +/K [918 0 R 126] +/P 2528 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +918 0 obj +<< +/K 127 +/P 917 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +919 0 obj +<< +/K 128 +/P 2529 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +920 0 obj +<< +/K 129 +/P 2888 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +921 0 obj +<< +/K 130 +/P 2531 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +922 0 obj +<< +/K [923 0 R 131] +/P 2532 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +923 0 obj +<< +/K 132 +/P 922 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +924 0 obj +<< +/K 133 +/P 2533 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +925 0 obj +<< +/K 134 +/P 2889 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +926 0 obj +<< +/K 135 +/P 2535 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +927 0 obj +<< +/K [928 0 R 136] +/P 2536 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +928 0 obj +<< +/K 137 +/P 927 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +929 0 obj +<< +/K 138 +/P 2537 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +930 0 obj +<< +/K 139 +/P 2890 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +931 0 obj +<< +/K 140 +/P 2539 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +932 0 obj +<< +/K [933 0 R 141] +/P 2540 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +933 0 obj +<< +/K 142 +/P 932 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +934 0 obj +<< +/K 143 +/P 2541 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +935 0 obj +<< +/K 144 +/P 2891 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +936 0 obj +<< +/K 145 +/P 2543 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +937 0 obj +<< +/K [938 0 R 146] +/P 2544 0 R +/Pg 11 0 R +/S /Code +/Type /StructElem +>> +endobj +938 0 obj +<< +/K 147 +/P 937 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +939 0 obj +<< +/K 148 +/P 2545 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +940 0 obj +<< +/K 149 +/P 2892 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +941 0 obj +<< +/K 150 +/P 2547 0 R +/Pg 11 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +942 0 obj +<< +/K [943 0 R 23] +/P 2548 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +943 0 obj +<< +/K 24 +/P 942 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +944 0 obj +<< +/K 25 +/P 2549 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +945 0 obj +<< +/K 26 +/P 2893 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +946 0 obj +<< +/K 27 +/P 2551 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +947 0 obj +<< +/K [948 0 R 28] +/P 2552 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +948 0 obj +<< +/K 29 +/P 947 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +949 0 obj +<< +/K 30 +/P 2553 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +950 0 obj +<< +/K 31 +/P 2894 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +951 0 obj +<< +/K 32 +/P 2555 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +952 0 obj +<< +/K [953 0 R 33] +/P 2556 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +953 0 obj +<< +/K 34 +/P 952 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +954 0 obj +<< +/K 35 +/P 2557 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +955 0 obj +<< +/K 36 +/P 2895 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +956 0 obj +<< +/K 37 +/P 2559 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +957 0 obj +<< +/K [958 0 R 38] +/P 2560 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +958 0 obj +<< +/K 39 +/P 957 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +959 0 obj +<< +/K 40 +/P 2561 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +960 0 obj +<< +/K 41 +/P 2896 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +961 0 obj +<< +/K 42 +/P 2563 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +962 0 obj +<< +/K 45 +/P 363 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +963 0 obj +<< +/K 47 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +964 0 obj +<< +/K 48 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +965 0 obj +<< +/K 49 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +966 0 obj +<< +/K 50 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +967 0 obj +<< +/K 51 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +968 0 obj +<< +/K 52 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +969 0 obj +<< +/K 53 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +970 0 obj +<< +/K 54 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +971 0 obj +<< +/K 55 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +972 0 obj +<< +/K 56 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +973 0 obj +<< +/K 57 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +974 0 obj +<< +/K 58 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +975 0 obj +<< +/K 59 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +976 0 obj +<< +/K 60 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +977 0 obj +<< +/K 61 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +978 0 obj +<< +/K 62 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +979 0 obj +<< +/K 63 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +980 0 obj +<< +/K 64 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +981 0 obj +<< +/K 65 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +982 0 obj +<< +/K 66 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +983 0 obj +<< +/K 67 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +984 0 obj +<< +/K 68 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +985 0 obj +<< +/K 69 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +986 0 obj +<< +/K 70 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +987 0 obj +<< +/K 71 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +988 0 obj +<< +/K 72 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +989 0 obj +<< +/K 73 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +990 0 obj +<< +/K 74 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +991 0 obj +<< +/K 75 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +992 0 obj +<< +/K 76 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +993 0 obj +<< +/K 77 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +994 0 obj +<< +/K 78 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +995 0 obj +<< +/K 79 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +996 0 obj +<< +/K 80 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +997 0 obj +<< +/K 81 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +998 0 obj +<< +/K 82 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +999 0 obj +<< +/K 83 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1000 0 obj +<< +/K 84 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1001 0 obj +<< +/K 85 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1002 0 obj +<< +/K 86 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1003 0 obj +<< +/K 87 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1004 0 obj +<< +/K 88 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1005 0 obj +<< +/K 89 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1006 0 obj +<< +/K 90 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1007 0 obj +<< +/K 91 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1008 0 obj +<< +/K 92 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1009 0 obj +<< +/K 93 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1010 0 obj +<< +/K 94 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1011 0 obj +<< +/K 95 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1012 0 obj +<< +/K 96 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1013 0 obj +<< +/K 97 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1014 0 obj +<< +/K 98 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1015 0 obj +<< +/K 99 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1016 0 obj +<< +/K 100 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1017 0 obj +<< +/K 101 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1018 0 obj +<< +/K 102 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1019 0 obj +<< +/K 103 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1020 0 obj +<< +/K 104 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1021 0 obj +<< +/K 105 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1022 0 obj +<< +/K 106 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1023 0 obj +<< +/K 107 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1024 0 obj +<< +/K 108 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1025 0 obj +<< +/K 109 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1026 0 obj +<< +/K 110 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1027 0 obj +<< +/K 111 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1028 0 obj +<< +/K 112 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1029 0 obj +<< +/K 113 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1030 0 obj +<< +/K 114 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1031 0 obj +<< +/K 115 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1032 0 obj +<< +/K 116 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1033 0 obj +<< +/K 117 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1034 0 obj +<< +/K 118 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1035 0 obj +<< +/K 119 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1036 0 obj +<< +/K 120 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1037 0 obj +<< +/K 121 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1038 0 obj +<< +/K 122 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1039 0 obj +<< +/K 123 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1040 0 obj +<< +/K 124 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1041 0 obj +<< +/K 125 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1042 0 obj +<< +/K 126 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1043 0 obj +<< +/K 127 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1044 0 obj +<< +/K 128 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1045 0 obj +<< +/K 129 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1046 0 obj +<< +/K 130 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1047 0 obj +<< +/K 131 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1048 0 obj +<< +/K 132 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1049 0 obj +<< +/K 133 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1050 0 obj +<< +/K 134 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1051 0 obj +<< +/K 135 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1052 0 obj +<< +/K 136 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1053 0 obj +<< +/K 137 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1054 0 obj +<< +/K 138 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1055 0 obj +<< +/K 139 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1056 0 obj +<< +/K 140 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1057 0 obj +<< +/K 141 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1058 0 obj +<< +/K 142 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1059 0 obj +<< +/K 143 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1060 0 obj +<< +/K 144 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1061 0 obj +<< +/K 145 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1062 0 obj +<< +/K 146 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1063 0 obj +<< +/K 147 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1064 0 obj +<< +/K 148 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1065 0 obj +<< +/K 149 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1066 0 obj +<< +/K 150 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1067 0 obj +<< +/K 151 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1068 0 obj +<< +/K 152 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1069 0 obj +<< +/K 153 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1070 0 obj +<< +/K 154 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1071 0 obj +<< +/K 155 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1072 0 obj +<< +/K 156 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1073 0 obj +<< +/K 157 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1074 0 obj +<< +/K 158 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1075 0 obj +<< +/K 159 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1076 0 obj +<< +/K 160 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1077 0 obj +<< +/K 161 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1078 0 obj +<< +/K 162 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1079 0 obj +<< +/K 163 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1080 0 obj +<< +/K 164 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1081 0 obj +<< +/K 165 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1082 0 obj +<< +/K 166 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1083 0 obj +<< +/K 167 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1084 0 obj +<< +/K 168 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1085 0 obj +<< +/K 169 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1086 0 obj +<< +/K 170 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1087 0 obj +<< +/K 171 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1088 0 obj +<< +/K 172 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1089 0 obj +<< +/K 173 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1090 0 obj +<< +/K 174 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1091 0 obj +<< +/K 175 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1092 0 obj +<< +/K 176 +/P 365 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1093 0 obj +<< +/K 178 +/P 366 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1094 0 obj +<< +/K 180 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1095 0 obj +<< +/K 181 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1096 0 obj +<< +/K 182 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1097 0 obj +<< +/K 183 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1098 0 obj +<< +/K 184 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1099 0 obj +<< +/K 185 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1100 0 obj +<< +/K 186 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1101 0 obj +<< +/K 187 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1102 0 obj +<< +/K 188 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1103 0 obj +<< +/K 189 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1104 0 obj +<< +/K 190 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1105 0 obj +<< +/K 191 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1106 0 obj +<< +/K 192 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1107 0 obj +<< +/K 193 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1108 0 obj +<< +/K 194 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1109 0 obj +<< +/K 195 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1110 0 obj +<< +/K 196 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1111 0 obj +<< +/K 197 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1112 0 obj +<< +/K 198 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1113 0 obj +<< +/K 199 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1114 0 obj +<< +/K 200 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1115 0 obj +<< +/K 201 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1116 0 obj +<< +/K 202 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1117 0 obj +<< +/K 203 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1118 0 obj +<< +/K 204 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1119 0 obj +<< +/K 205 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1120 0 obj +<< +/K 206 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1121 0 obj +<< +/K 207 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1122 0 obj +<< +/K 208 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1123 0 obj +<< +/K 209 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1124 0 obj +<< +/K 210 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1125 0 obj +<< +/K 211 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1126 0 obj +<< +/K 212 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1127 0 obj +<< +/K 213 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1128 0 obj +<< +/K 214 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1129 0 obj +<< +/K 215 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1130 0 obj +<< +/K 216 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1131 0 obj +<< +/K 217 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1132 0 obj +<< +/K 218 +/P 368 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1133 0 obj +<< +/K 220 +/P 369 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1134 0 obj +<< +/K 222 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1135 0 obj +<< +/K 223 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1136 0 obj +<< +/K 224 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1137 0 obj +<< +/K 225 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1138 0 obj +<< +/K 226 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1139 0 obj +<< +/K 227 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1140 0 obj +<< +/K 228 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1141 0 obj +<< +/K 229 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1142 0 obj +<< +/K 230 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1143 0 obj +<< +/K 231 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1144 0 obj +<< +/K 232 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1145 0 obj +<< +/K 233 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1146 0 obj +<< +/K 234 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1147 0 obj +<< +/K 235 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1148 0 obj +<< +/K 236 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1149 0 obj +<< +/K 237 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1150 0 obj +<< +/K 238 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1151 0 obj +<< +/K 239 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1152 0 obj +<< +/K 240 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1153 0 obj +<< +/K 241 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1154 0 obj +<< +/K 242 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1155 0 obj +<< +/K 243 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1156 0 obj +<< +/K 244 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1157 0 obj +<< +/K 245 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1158 0 obj +<< +/K 246 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1159 0 obj +<< +/K 247 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1160 0 obj +<< +/K 248 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1161 0 obj +<< +/K 249 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1162 0 obj +<< +/K 250 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1163 0 obj +<< +/K 251 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1164 0 obj +<< +/K 252 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1165 0 obj +<< +/K 253 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1166 0 obj +<< +/K 254 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1167 0 obj +<< +/K 255 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1168 0 obj +<< +/K 256 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1169 0 obj +<< +/K 257 +/P 371 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1170 0 obj +<< +/K 259 +/P 372 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1171 0 obj +<< +/K 261 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1172 0 obj +<< +/K 262 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1173 0 obj +<< +/K 263 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1174 0 obj +<< +/K 264 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1175 0 obj +<< +/K 265 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1176 0 obj +<< +/K 266 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1177 0 obj +<< +/K 267 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1178 0 obj +<< +/K 268 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1179 0 obj +<< +/K 269 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1180 0 obj +<< +/K 270 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1181 0 obj +<< +/K 271 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1182 0 obj +<< +/K 272 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1183 0 obj +<< +/K 273 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1184 0 obj +<< +/K 274 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1185 0 obj +<< +/K 275 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1186 0 obj +<< +/K 276 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1187 0 obj +<< +/K 277 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1188 0 obj +<< +/K 278 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1189 0 obj +<< +/K 279 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1190 0 obj +<< +/K 280 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1191 0 obj +<< +/K 281 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1192 0 obj +<< +/K 282 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1193 0 obj +<< +/K 283 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1194 0 obj +<< +/K 284 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1195 0 obj +<< +/K 285 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1196 0 obj +<< +/K 286 +/P 374 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1197 0 obj +<< +/K 289 +/P 377 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1198 0 obj +<< +/K 291 +/P 379 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1199 0 obj +<< +/K [294 << +/MCID 22 +/Pg 13 0 R +/Type /MCR +>>] +/P 254 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1200 0 obj +<< +/K [295 << +/MCID 23 +/Pg 13 0 R +/Type /MCR +>>] +/P 255 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1201 0 obj +<< +/K [296 << +/MCID 24 +/Pg 13 0 R +/Type /MCR +>>] +/P 256 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1202 0 obj +<< +/K [297 << +/MCID 25 +/Pg 13 0 R +/Type /MCR +>>] +/P 257 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1203 0 obj +<< +/K [1204 0 R 298] +/P 2564 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +1204 0 obj +<< +/K 299 +/P 1203 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1205 0 obj +<< +/K 300 +/P 2564 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1206 0 obj +<< +/K 301 +/P 2565 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1207 0 obj +<< +/K 302 +/P 2897 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1208 0 obj +<< +/K 303 +/P 2566 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1209 0 obj +<< +/K 304 +/P 2898 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1210 0 obj +<< +/K [1211 0 R 305] +/P 2568 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +1211 0 obj +<< +/K 306 +/P 1210 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1212 0 obj +<< +/K 307 +/P 2568 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1213 0 obj +<< +/K [1214 0 R 308] +/P 2568 0 R +/Pg 12 0 R +/S /Code +/Type /StructElem +>> +endobj +1214 0 obj +<< +/K 309 +/P 1213 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1215 0 obj +<< +/K 310 +/P 2569 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1216 0 obj +<< +/K 311 +/P 2570 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1217 0 obj +<< +/K 312 +/P 2899 0 R +/Pg 12 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1218 0 obj +<< +/K [1219 0 R 26] +/P 2572 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1219 0 obj +<< +/K 27 +/P 1218 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1220 0 obj +<< +/K 28 +/P 2573 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1221 0 obj +<< +/K 29 +/P 2574 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1222 0 obj +<< +/K 30 +/P 2900 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1223 0 obj +<< +/K [1224 0 R 31] +/P 2576 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1224 0 obj +<< +/K 32 +/P 1223 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1225 0 obj +<< +/K 33 +/P 2577 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1226 0 obj +<< +/K 34 +/P 2578 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1227 0 obj +<< +/K 35 +/P 2901 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1228 0 obj +<< +/K [1229 0 R 36] +/P 2580 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1229 0 obj +<< +/K 37 +/P 1228 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1230 0 obj +<< +/K 38 +/P 2581 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1231 0 obj +<< +/K 39 +/P 2582 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1232 0 obj +<< +/K 40 +/P 2902 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1233 0 obj +<< +/K [1234 0 R 41] +/P 2584 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1234 0 obj +<< +/K 42 +/P 1233 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1235 0 obj +<< +/K 43 +/P 2584 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1236 0 obj +<< +/K [1237 0 R 44] +/P 2584 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1237 0 obj +<< +/K 45 +/P 1236 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1238 0 obj +<< +/K 46 +/P 2585 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1239 0 obj +<< +/K 47 +/P 2586 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1240 0 obj +<< +/K 48 +/P 2903 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1241 0 obj +<< +/K [1242 0 R 49] +/P 2588 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1242 0 obj +<< +/K 50 +/P 1241 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1243 0 obj +<< +/K 51 +/P 2588 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1244 0 obj +<< +/K [1245 0 R 52] +/P 2588 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1245 0 obj +<< +/K 53 +/P 1244 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1246 0 obj +<< +/K 54 +/P 2589 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1247 0 obj +<< +/K 55 +/P 2590 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1248 0 obj +<< +/K 56 +/P 2904 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1249 0 obj +<< +/K [1250 0 R 57] +/P 2592 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1250 0 obj +<< +/K 58 +/P 1249 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1251 0 obj +<< +/K 59 +/P 2592 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1252 0 obj +<< +/K [1253 0 R 60] +/P 2592 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1253 0 obj +<< +/K 61 +/P 1252 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1254 0 obj +<< +/K 62 +/P 2593 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1255 0 obj +<< +/K 63 +/P 2594 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1256 0 obj +<< +/K 64 +/P 2905 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1257 0 obj +<< +/K 66 +/P 392 0 R +/Pg 13 0 R +/S /Lbl +/Type /StructElem +>> +endobj +1258 0 obj +<< +/K 67 +/P 2596 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1259 0 obj +<< +/K 68 +/P 392 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1260 0 obj +<< +/K 69 +/P 393 0 R +/Pg 13 0 R +/S /Lbl +/Type /StructElem +>> +endobj +1261 0 obj +<< +/K 70 +/P 2597 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1262 0 obj +<< +/K 71 +/P 393 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1263 0 obj +<< +/K [1264 0 R 72] +/P 393 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1264 0 obj +<< +/K 73 +/P 1263 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1265 0 obj +<< +/K 74 +/P 393 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1266 0 obj +<< +/K [1267 0 R 75] +/P 393 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1267 0 obj +<< +/K 76 +/P 1266 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1268 0 obj +<< +/K 77 +/P 393 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1269 0 obj +<< +/K [1270 0 R 78] +/P 393 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1270 0 obj +<< +/K 79 +/P 1269 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1271 0 obj +<< +/K 80 +/P 393 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1272 0 obj +<< +/K [1273 0 R 81] +/P 393 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1273 0 obj +<< +/K 82 +/P 1272 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1274 0 obj +<< +/K 83 +/P 393 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1275 0 obj +<< +/K [1276 0 R 84] +/P 393 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1276 0 obj +<< +/K 85 +/P 1275 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1277 0 obj +<< +/K 86 +/P 393 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1278 0 obj +<< +/K 87 +/P 394 0 R +/Pg 13 0 R +/S /Lbl +/Type /StructElem +>> +endobj +1279 0 obj +<< +/K 88 +/P 2598 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1280 0 obj +<< +/K 89 +/P 394 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1281 0 obj +<< +/K [1282 0 R 90] +/P 394 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1282 0 obj +<< +/K 91 +/P 1281 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1283 0 obj +<< +/K 92 +/P 394 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1284 0 obj +<< +/K [1285 0 R 93] +/P 394 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1285 0 obj +<< +/K 94 +/P 1284 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1286 0 obj +<< +/K 95 +/P 395 0 R +/Pg 13 0 R +/S /Lbl +/Type /StructElem +>> +endobj +1287 0 obj +<< +/K 96 +/P 2599 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1288 0 obj +<< +/K 97 +/P 395 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1289 0 obj +<< +/K 98 +/P 396 0 R +/Pg 13 0 R +/S /Lbl +/Type /StructElem +>> +endobj +1290 0 obj +<< +/K 99 +/P 2600 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1291 0 obj +<< +/K 100 +/P 396 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1292 0 obj +<< +/K 101 +/P 397 0 R +/Pg 13 0 R +/S /Lbl +/Type /StructElem +>> +endobj +1293 0 obj +<< +/K 102 +/P 2601 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1294 0 obj +<< +/K 103 +/P 397 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1295 0 obj +<< +/K [1296 0 R 104] +/P 397 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1296 0 obj +<< +/K 105 +/P 1295 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1297 0 obj +<< +/K 106 +/P 397 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1298 0 obj +<< +/K 109 +/P 258 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1299 0 obj +<< +/K 110 +/P 259 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1300 0 obj +<< +/K 111 +/P 260 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1301 0 obj +<< +/K [1302 0 R 112] +/P 2602 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1302 0 obj +<< +/K 113 +/P 1301 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1303 0 obj +<< +/K 114 +/P 2603 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1304 0 obj +<< +/K 115 +/P 2906 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1305 0 obj +<< +/K 116 +/P 2604 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1306 0 obj +<< +/K [1307 0 R 117] +/P 2605 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1307 0 obj +<< +/K 118 +/P 1306 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1308 0 obj +<< +/K 119 +/P 2606 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1309 0 obj +<< +/K [1310 0 R 120] +/P 2607 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1310 0 obj +<< +/K 121 +/P 1309 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1311 0 obj +<< +/K [1312 0 R 122] +/P 2608 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1312 0 obj +<< +/K 123 +/P 1311 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1313 0 obj +<< +/K 124 +/P 2609 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1314 0 obj +<< +/K [1315 0 R 125] +/P 2610 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1315 0 obj +<< +/K 126 +/P 1314 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1316 0 obj +<< +/K [1317 0 R 127] +/P 2611 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1317 0 obj +<< +/K 128 +/P 1316 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1318 0 obj +<< +/K 129 +/P 2612 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1319 0 obj +<< +/K [1320 0 R 130 132] +/P 2613 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1320 0 obj +<< +/K [131 133] +/P 1319 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1321 0 obj +<< +/K [1322 0 R 134] +/P 2614 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1322 0 obj +<< +/K 135 +/P 1321 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1323 0 obj +<< +/K 136 +/P 2615 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1324 0 obj +<< +/K [1325 0 R 137] +/P 2616 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1325 0 obj +<< +/K 138 +/P 1324 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1326 0 obj +<< +/K [1327 0 R 139] +/P 2617 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1327 0 obj +<< +/K 140 +/P 1326 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1328 0 obj +<< +/K 141 +/P 2618 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1329 0 obj +<< +/K [1330 0 R 142 144] +/P 2619 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1330 0 obj +<< +/K [143 145] +/P 1329 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1331 0 obj +<< +/K [1332 0 R 146] +/P 2620 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1332 0 obj +<< +/K 147 +/P 1331 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1333 0 obj +<< +/K 148 +/P 2621 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1334 0 obj +<< +/K [1335 0 R 149] +/P 2622 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1335 0 obj +<< +/K 150 +/P 1334 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1336 0 obj +<< +/K [1337 0 R 151] +/P 2623 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1337 0 obj +<< +/K 152 +/P 1336 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1338 0 obj +<< +/K 153 +/P 2624 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1339 0 obj +<< +/K 154 +/P 2625 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1340 0 obj +<< +/K [1341 0 R 155] +/P 2626 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1341 0 obj +<< +/K 156 +/P 1340 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1342 0 obj +<< +/K 157 +/P 2627 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1343 0 obj +<< +/K 158 +/P 2628 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1344 0 obj +<< +/K [1345 0 R 159] +/P 2629 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1345 0 obj +<< +/K 160 +/P 1344 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1346 0 obj +<< +/K 161 +/P 2630 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1347 0 obj +<< +/K 162 +/P 2631 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1348 0 obj +<< +/K [1349 0 R 163 165] +/P 2632 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1349 0 obj +<< +/K [164 166] +/P 1348 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1350 0 obj +<< +/K 167 +/P 2633 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1351 0 obj +<< +/K 168 +/P 2634 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1352 0 obj +<< +/K 169 +/P 2635 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1353 0 obj +<< +/K 170 +/P 412 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1354 0 obj +<< +/K [1355 0 R 171] +/P 412 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1355 0 obj +<< +/K 172 +/P 1354 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1356 0 obj +<< +/K 173 +/P 412 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1357 0 obj +<< +/K [1358 0 R 174] +/P 412 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1358 0 obj +<< +/K 175 +/P 1357 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1359 0 obj +<< +/K 176 +/P 412 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1360 0 obj +<< +/K [1361 0 R 177] +/P 412 0 R +/Pg 13 0 R +/S /Code +/Type /StructElem +>> +endobj +1361 0 obj +<< +/K 178 +/P 1360 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1362 0 obj +<< +/K 179 +/P 412 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1363 0 obj +<< +/K [181 << +/MCID 29 +/Pg 14 0 R +/Type /MCR +>>] +/P 261 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1364 0 obj +<< +/K [182 << +/MCID 30 +/Pg 14 0 R +/Type /MCR +>>] +/P 262 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1365 0 obj +<< +/K [183 << +/MCID 31 +/Pg 14 0 R +/Type /MCR +>>] +/P 263 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1366 0 obj +<< +/K 184 +/P 2636 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1367 0 obj +<< +/K 185 +/P 2637 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1368 0 obj +<< +/K 186 +/P 2907 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1369 0 obj +<< +/K 187 +/P 2638 0 R +/Pg 13 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1370 0 obj +<< +/K 32 +/P 2639 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1371 0 obj +<< +/K 33 +/P 2640 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1372 0 obj +<< +/K 34 +/P 2908 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1373 0 obj +<< +/K 35 +/P 2641 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1374 0 obj +<< +/K 38 +/P 419 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1375 0 obj +<< +/K 40 +/P 264 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1376 0 obj +<< +/K 41 +/P 265 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1377 0 obj +<< +/K 42 +/P 266 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1378 0 obj +<< +/K [1379 0 R 43] +/P 2642 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1379 0 obj +<< +/K 44 +/P 1378 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1380 0 obj +<< +/K 45 +/P 2642 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1381 0 obj +<< +/K 46 +/P 2643 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1382 0 obj +<< +/K 47 +/P 2909 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1383 0 obj +<< +/K [1384 0 R 48] +/P 2645 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1384 0 obj +<< +/K 49 +/P 1383 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1385 0 obj +<< +/K 50 +/P 2645 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1386 0 obj +<< +/K 51 +/P 2646 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1387 0 obj +<< +/K 52 +/P 2910 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1388 0 obj +<< +/K [1389 0 R 53] +/P 2648 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1389 0 obj +<< +/K 54 +/P 1388 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1390 0 obj +<< +/K 55 +/P 2649 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1391 0 obj +<< +/K 56 +/P 2911 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1392 0 obj +<< +/K [1393 0 R 57] +/P 2651 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1393 0 obj +<< +/K 58 +/P 1392 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1394 0 obj +<< +/K 59 +/P 2652 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1395 0 obj +<< +/K 60 +/P 2912 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1396 0 obj +<< +/K [1397 0 R 61] +/P 2654 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1397 0 obj +<< +/K 62 +/P 1396 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1398 0 obj +<< +/K 63 +/P 2655 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1399 0 obj +<< +/K 64 +/P 2913 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1400 0 obj +<< +/K [1401 0 R 65] +/P 2657 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1401 0 obj +<< +/K 66 +/P 1400 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1402 0 obj +<< +/K 67 +/P 2658 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1403 0 obj +<< +/K 68 +/P 2914 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1404 0 obj +<< +/K 71 +/P 430 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1405 0 obj +<< +/K 73 +/P 267 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1406 0 obj +<< +/K 74 +/P 268 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1407 0 obj +<< +/K 75 +/P 269 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1408 0 obj +<< +/K 76 +/P 270 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1409 0 obj +<< +/K 77 +/P 2660 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1410 0 obj +<< +/K [1411 0 R 78] +/P 2661 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1411 0 obj +<< +/K 79 +/P 1410 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1412 0 obj +<< +/K 80 +/P 2661 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1413 0 obj +<< +/K [1414 0 R 81] +/P 2662 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1414 0 obj +<< +/K 82 +/P 1413 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1415 0 obj +<< +/K 83 +/P 2663 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1416 0 obj +<< +/K 84 +/P 2664 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1417 0 obj +<< +/K [1418 0 R 85] +/P 2665 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1418 0 obj +<< +/K 86 +/P 1417 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1419 0 obj +<< +/K 87 +/P 2665 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1420 0 obj +<< +/K [1421 0 R 88] +/P 2666 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1421 0 obj +<< +/K 89 +/P 1420 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1422 0 obj +<< +/K 90 +/P 2667 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1423 0 obj +<< +/K 91 +/P 2668 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1424 0 obj +<< +/K [1425 0 R 92] +/P 2669 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1425 0 obj +<< +/K 93 +/P 1424 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1426 0 obj +<< +/K 94 +/P 2669 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1427 0 obj +<< +/K [1428 0 R 95] +/P 2670 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1428 0 obj +<< +/K 96 +/P 1427 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1429 0 obj +<< +/K 97 +/P 2671 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1430 0 obj +<< +/K 98 +/P 436 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1431 0 obj +<< +/K 100 +/P 438 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1432 0 obj +<< +/K 103 +/P 440 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1433 0 obj +<< +/K 106 +/P 442 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1434 0 obj +<< +/K 109 +/P 444 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1435 0 obj +<< +/K 111 +/P 446 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1436 0 obj +<< +/K 114 +/P 448 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1437 0 obj +<< +/K 117 +/P 450 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1438 0 obj +<< +/K 120 +/P 452 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1439 0 obj +<< +/K 123 +/P 454 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1440 0 obj +<< +/K 126 +/P 456 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1441 0 obj +<< +/K [129 131] +/P 458 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1442 0 obj +<< +/K [134 << +/MCID 23 +/Pg 15 0 R +/Type /MCR +>>] +/P 271 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1443 0 obj +<< +/K [135 << +/MCID 24 +/Pg 15 0 R +/Type /MCR +>>] +/P 272 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1444 0 obj +<< +/K [136 << +/MCID 25 +/Pg 15 0 R +/Type /MCR +>>] +/P 273 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1445 0 obj +<< +/K [137 << +/MCID 26 +/Pg 15 0 R +/Type /MCR +>>] +/P 274 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1446 0 obj +<< +/K [1447 0 R 138] +/P 2672 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1447 0 obj +<< +/K 139 +/P 1446 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1448 0 obj +<< +/K 140 +/P 2673 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1449 0 obj +<< +/K 141 +/P 2915 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1450 0 obj +<< +/K 142 +/P 2675 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1451 0 obj +<< +/K [1452 0 R 143] +/P 2676 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1452 0 obj +<< +/K 144 +/P 1451 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1453 0 obj +<< +/K 145 +/P 2677 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1454 0 obj +<< +/K 146 +/P 2916 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1455 0 obj +<< +/K 147 +/P 2679 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1456 0 obj +<< +/K [1457 0 R 148] +/P 2680 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1457 0 obj +<< +/K 149 +/P 1456 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1458 0 obj +<< +/K 150 +/P 2681 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1459 0 obj +<< +/K 151 +/P 2917 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1460 0 obj +<< +/K 152 +/P 2683 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1461 0 obj +<< +/K [1462 0 R 153] +/P 2684 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1462 0 obj +<< +/K 154 +/P 1461 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1463 0 obj +<< +/K 155 +/P 2685 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1464 0 obj +<< +/K 156 +/P 2918 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1465 0 obj +<< +/K 157 +/P 2687 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1466 0 obj +<< +/K [1467 0 R 158] +/P 2688 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1467 0 obj +<< +/K 159 +/P 1466 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1468 0 obj +<< +/K 160 +/P 2689 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1469 0 obj +<< +/K 161 +/P 2919 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1470 0 obj +<< +/K 162 +/P 2691 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1471 0 obj +<< +/K [1472 0 R 163] +/P 2692 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1472 0 obj +<< +/K 164 +/P 1471 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1473 0 obj +<< +/K 165 +/P 2693 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1474 0 obj +<< +/K 166 +/P 2920 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1475 0 obj +<< +/K 167 +/P 2695 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1476 0 obj +<< +/K [1477 0 R 168] +/P 2696 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1477 0 obj +<< +/K 169 +/P 1476 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1478 0 obj +<< +/K 170 +/P 2697 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1479 0 obj +<< +/K 171 +/P 2921 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1480 0 obj +<< +/K 172 +/P 2699 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1481 0 obj +<< +/K [1482 0 R 173] +/P 2700 0 R +/Pg 14 0 R +/S /Code +/Type /StructElem +>> +endobj +1482 0 obj +<< +/K 174 +/P 1481 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1483 0 obj +<< +/K 175 +/P 2701 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1484 0 obj +<< +/K 176 +/P 2922 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1485 0 obj +<< +/K 177 +/P 2703 0 R +/Pg 14 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1486 0 obj +<< +/A [<< +/O /Table +/Scope /Column +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1526 0 R 18] +/P 485 0 R +/Pg 15 0 R +/S /TH +/Type /StructElem +>> +endobj +1487 0 obj +<< +/K [1488 0 R 27] +/P 2704 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +1488 0 obj +<< +/K 28 +/P 1487 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1489 0 obj +<< +/K 29 +/P 2705 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1490 0 obj +<< +/K 30 +/P 2923 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1491 0 obj +<< +/K 31 +/P 2707 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1492 0 obj +<< +/K [1493 0 R 32] +/P 2708 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +1493 0 obj +<< +/K 33 +/P 1492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1494 0 obj +<< +/K 34 +/P 2709 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1495 0 obj +<< +/K 35 +/P 2924 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1496 0 obj +<< +/K 36 +/P 2711 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1497 0 obj +<< +/K [1498 0 R 37] +/P 2712 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +1498 0 obj +<< +/K 38 +/P 1497 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1499 0 obj +<< +/K 39 +/P 2713 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1500 0 obj +<< +/K 40 +/P 2925 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1501 0 obj +<< +/K 41 +/P 2715 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1502 0 obj +<< +/K [1503 0 R 42] +/P 2716 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +1503 0 obj +<< +/K 43 +/P 1502 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1504 0 obj +<< +/K 44 +/P 2717 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1505 0 obj +<< +/K 45 +/P 2926 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1506 0 obj +<< +/K 46 +/P 2719 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1507 0 obj +<< +/K 48 +/P 275 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1508 0 obj +<< +/K 49 +/P 276 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1509 0 obj +<< +/K 50 +/P 277 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1510 0 obj +<< +/K 51 +/P 2720 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1511 0 obj +<< +/K 52 +/P 2721 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1512 0 obj +<< +/K 53 +/P 2927 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1513 0 obj +<< +/K 54 +/P 2723 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1514 0 obj +<< +/K 55 +/P 2724 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1515 0 obj +<< +/K 56 +/P 2928 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1516 0 obj +<< +/K 57 +/P 2726 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1517 0 obj +<< +/K 58 +/P 2727 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1518 0 obj +<< +/K 59 +/P 2929 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1519 0 obj +<< +/K 60 +/P 2729 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1520 0 obj +<< +/K 61 +/P 2730 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1521 0 obj +<< +/K 62 +/P 2930 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1522 0 obj +<< +/K 66 +/P 482 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1523 0 obj +<< +/K 69 +/P 278 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1524 0 obj +<< +/K 70 +/P 279 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1525 0 obj +<< +/K 71 +/P 280 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1526 0 obj +<< +/K 72 +/P 1486 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1527 0 obj +<< +/K 73 +/P 2732 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1528 0 obj +<< +/K [1529 0 R 74] +/P 2733 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +1529 0 obj +<< +/K 75 +/P 1528 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1530 0 obj +<< +/K 76 +/P 2733 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1531 0 obj +<< +/K 77 +/P 2931 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1532 0 obj +<< +/K 78 +/P 2734 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1533 0 obj +<< +/K 79 +/P 2735 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1534 0 obj +<< +/K [1535 0 R 80] +/P 2736 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +1535 0 obj +<< +/K 81 +/P 1534 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1536 0 obj +<< +/K 82 +/P 2736 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1537 0 obj +<< +/K 83 +/P 2932 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1538 0 obj +<< +/K 84 +/P 2737 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1539 0 obj +<< +/K 85 +/P 2738 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1540 0 obj +<< +/K 86 +/P 2739 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1541 0 obj +<< +/K 87 +/P 2933 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1542 0 obj +<< +/K 88 +/P 2741 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1543 0 obj +<< +/K 89 +/P 2742 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1544 0 obj +<< +/K 90 +/P 2934 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1545 0 obj +<< +/K 91 +/P 2744 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1546 0 obj +<< +/K 92 +/P 2745 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1547 0 obj +<< +/K 93 +/P 2935 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1548 0 obj +<< +/K 94 +/P 2746 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1549 0 obj +<< +/K 96 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1550 0 obj +<< +/K 97 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1551 0 obj +<< +/K 98 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1552 0 obj +<< +/K 99 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1553 0 obj +<< +/K 100 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1554 0 obj +<< +/K 101 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1555 0 obj +<< +/K 102 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1556 0 obj +<< +/K 103 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1557 0 obj +<< +/K 104 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1558 0 obj +<< +/K 105 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1559 0 obj +<< +/K 106 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1560 0 obj +<< +/K 107 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1561 0 obj +<< +/K 108 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1562 0 obj +<< +/K 109 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1563 0 obj +<< +/K 110 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1564 0 obj +<< +/K 111 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1565 0 obj +<< +/K 112 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1566 0 obj +<< +/K 113 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1567 0 obj +<< +/K 114 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1568 0 obj +<< +/K 115 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1569 0 obj +<< +/K 116 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1570 0 obj +<< +/K 117 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1571 0 obj +<< +/K 118 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1572 0 obj +<< +/K 119 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1573 0 obj +<< +/K 120 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1574 0 obj +<< +/K 121 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1575 0 obj +<< +/K 122 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1576 0 obj +<< +/K 123 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1577 0 obj +<< +/K 124 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1578 0 obj +<< +/K 125 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1579 0 obj +<< +/K 126 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1580 0 obj +<< +/K 127 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1581 0 obj +<< +/K 128 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1582 0 obj +<< +/K 129 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1583 0 obj +<< +/K 130 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1584 0 obj +<< +/K 131 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1585 0 obj +<< +/K 132 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1586 0 obj +<< +/K 133 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1587 0 obj +<< +/K 134 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1588 0 obj +<< +/K 135 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1589 0 obj +<< +/K 136 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1590 0 obj +<< +/K 137 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1591 0 obj +<< +/K 138 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1592 0 obj +<< +/K 139 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1593 0 obj +<< +/K 140 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1594 0 obj +<< +/K 141 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1595 0 obj +<< +/K 142 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1596 0 obj +<< +/K 143 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1597 0 obj +<< +/K 144 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1598 0 obj +<< +/K 145 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1599 0 obj +<< +/K 146 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1600 0 obj +<< +/K 147 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1601 0 obj +<< +/K 148 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1602 0 obj +<< +/K 149 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1603 0 obj +<< +/K 150 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1604 0 obj +<< +/K 151 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1605 0 obj +<< +/K 152 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1606 0 obj +<< +/K 153 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1607 0 obj +<< +/K 154 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1608 0 obj +<< +/K 155 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1609 0 obj +<< +/K 156 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1610 0 obj +<< +/K 157 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1611 0 obj +<< +/K 158 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1612 0 obj +<< +/K 159 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1613 0 obj +<< +/K 160 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1614 0 obj +<< +/K 161 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1615 0 obj +<< +/K 162 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1616 0 obj +<< +/K 163 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1617 0 obj +<< +/K 164 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1618 0 obj +<< +/K 165 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1619 0 obj +<< +/K 166 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1620 0 obj +<< +/K 167 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1621 0 obj +<< +/K 168 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1622 0 obj +<< +/K 169 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1623 0 obj +<< +/K 170 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1624 0 obj +<< +/K 171 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1625 0 obj +<< +/K 172 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1626 0 obj +<< +/K 173 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1627 0 obj +<< +/K 174 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1628 0 obj +<< +/K 175 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1629 0 obj +<< +/K 176 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1630 0 obj +<< +/K 177 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1631 0 obj +<< +/K 178 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1632 0 obj +<< +/K 179 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1633 0 obj +<< +/K 180 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1634 0 obj +<< +/K 181 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1635 0 obj +<< +/K 182 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1636 0 obj +<< +/K 183 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1637 0 obj +<< +/K 184 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1638 0 obj +<< +/K 185 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1639 0 obj +<< +/K 186 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1640 0 obj +<< +/K 187 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1641 0 obj +<< +/K 188 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1642 0 obj +<< +/K 189 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1643 0 obj +<< +/K 190 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1644 0 obj +<< +/K 191 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1645 0 obj +<< +/K 192 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1646 0 obj +<< +/K 193 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1647 0 obj +<< +/K 194 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1648 0 obj +<< +/K 195 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1649 0 obj +<< +/K 196 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1650 0 obj +<< +/K 197 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1651 0 obj +<< +/K 198 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1652 0 obj +<< +/K 199 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1653 0 obj +<< +/K 200 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1654 0 obj +<< +/K 201 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1655 0 obj +<< +/K 202 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1656 0 obj +<< +/K 203 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1657 0 obj +<< +/K 204 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1658 0 obj +<< +/K 205 +/P 492 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1659 0 obj +<< +/K 207 +/P 494 0 R +/Pg 15 0 R +/S /Lbl +/Type /StructElem +>> +endobj +1660 0 obj +<< +/K [1661 0 R 208] +/P 494 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +1661 0 obj +<< +/K 209 +/P 1660 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1662 0 obj +<< +/K 210 +/P 494 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1663 0 obj +<< +/K 211 +/P 495 0 R +/Pg 15 0 R +/S /Lbl +/Type /StructElem +>> +endobj +1664 0 obj +<< +/K 212 +/P 495 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1665 0 obj +<< +/K [1666 0 R 213] +/P 495 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +1666 0 obj +<< +/K 214 +/P 1665 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1667 0 obj +<< +/K 215 +/P 495 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1668 0 obj +<< +/K [1669 0 R 216] +/P 495 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +1669 0 obj +<< +/K 217 +/P 1668 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1670 0 obj +<< +/K 218 +/P 495 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1671 0 obj +<< +/K 219 +/P 496 0 R +/Pg 15 0 R +/S /Lbl +/Type /StructElem +>> +endobj +1672 0 obj +<< +/K 220 +/P 496 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1673 0 obj +<< +/K 221 +/P 497 0 R +/Pg 15 0 R +/S /Lbl +/Type /StructElem +>> +endobj +1674 0 obj +<< +/K [1675 0 R 222] +/P 497 0 R +/Pg 15 0 R +/S /Code +/Type /StructElem +>> +endobj +1675 0 obj +<< +/K 223 +/P 1674 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1676 0 obj +<< +/K 224 +/P 497 0 R +/Pg 15 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1677 0 obj +<< +/K 10 +/P 501 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1678 0 obj +<< +/K 13 +/P 503 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1679 0 obj +<< +/K 15 +/P 505 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1680 0 obj +<< +/K 21 +/P 511 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1681 0 obj +<< +/K 23 +/P 513 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1682 0 obj +<< +/K 26 +/P 515 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1683 0 obj +<< +/K 29 +/P 517 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1684 0 obj +<< +/K 32 +/P 519 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1685 0 obj +<< +/K 34 +/P 521 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1686 0 obj +<< +/K 37 +/P 524 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1687 0 obj +<< +/K 39 +/P 526 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1688 0 obj +<< +/K 42 +/P 528 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1689 0 obj +<< +/K 44 +/P 530 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1690 0 obj +<< +/K 46 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1691 0 obj +<< +/K 47 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1692 0 obj +<< +/K 48 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1693 0 obj +<< +/K 49 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1694 0 obj +<< +/K 50 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1695 0 obj +<< +/K 51 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1696 0 obj +<< +/K 52 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1697 0 obj +<< +/K 53 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1698 0 obj +<< +/K 54 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1699 0 obj +<< +/K 55 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1700 0 obj +<< +/K 56 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1701 0 obj +<< +/K 57 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1702 0 obj +<< +/K 58 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1703 0 obj +<< +/K 59 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1704 0 obj +<< +/K 60 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1705 0 obj +<< +/K 61 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1706 0 obj +<< +/K 62 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1707 0 obj +<< +/K 63 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1708 0 obj +<< +/K 64 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1709 0 obj +<< +/K 65 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1710 0 obj +<< +/K 66 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1711 0 obj +<< +/K 67 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1712 0 obj +<< +/K 68 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1713 0 obj +<< +/K 69 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1714 0 obj +<< +/K 70 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1715 0 obj +<< +/K 71 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1716 0 obj +<< +/K 72 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1717 0 obj +<< +/K 73 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1718 0 obj +<< +/K 74 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1719 0 obj +<< +/K 75 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1720 0 obj +<< +/K 76 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1721 0 obj +<< +/K 77 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1722 0 obj +<< +/K 78 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1723 0 obj +<< +/K 79 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1724 0 obj +<< +/K 80 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1725 0 obj +<< +/K 81 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1726 0 obj +<< +/K 82 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1727 0 obj +<< +/K 83 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1728 0 obj +<< +/K 84 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1729 0 obj +<< +/K 85 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1730 0 obj +<< +/K 86 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1731 0 obj +<< +/K 87 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1732 0 obj +<< +/K 88 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1733 0 obj +<< +/K 89 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1734 0 obj +<< +/K 90 +/P 532 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1735 0 obj +<< +/K 91 +/P 533 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1736 0 obj +<< +/K 94 +/P 536 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1737 0 obj +<< +/K 96 +/P 538 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1738 0 obj +<< +/K 99 +/P 540 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1739 0 obj +<< +/K 102 +/P 542 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1740 0 obj +<< +/K 104 +/P 544 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1741 0 obj +<< +/K 107 +/P 546 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1742 0 obj +<< +/K 110 +/P 548 0 R +/Pg 16 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1743 0 obj +<< +/K 4 +/P 550 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1744 0 obj +<< +/K 6 +/P 552 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1745 0 obj +<< +/K 9 +/P 554 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1746 0 obj +<< +/K 12 +/P 556 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1747 0 obj +<< +/K 15 +/P 558 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1748 0 obj +<< +/K 18 +/P 560 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1749 0 obj +<< +/K 20 +/P 562 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1750 0 obj +<< +/K 22 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1751 0 obj +<< +/K 23 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1752 0 obj +<< +/K 24 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1753 0 obj +<< +/K 25 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1754 0 obj +<< +/K 26 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1755 0 obj +<< +/K 27 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1756 0 obj +<< +/K 28 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1757 0 obj +<< +/K 29 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1758 0 obj +<< +/K 30 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1759 0 obj +<< +/K 31 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1760 0 obj +<< +/K 32 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1761 0 obj +<< +/K 33 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1762 0 obj +<< +/K 34 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1763 0 obj +<< +/K 35 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1764 0 obj +<< +/K 36 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1765 0 obj +<< +/K 37 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1766 0 obj +<< +/K 38 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1767 0 obj +<< +/K 39 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1768 0 obj +<< +/K 40 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1769 0 obj +<< +/K 41 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1770 0 obj +<< +/K 42 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1771 0 obj +<< +/K 43 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1772 0 obj +<< +/K 44 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1773 0 obj +<< +/K 45 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1774 0 obj +<< +/K 46 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1775 0 obj +<< +/K 47 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1776 0 obj +<< +/K 48 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1777 0 obj +<< +/K 49 +/P 564 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1778 0 obj +<< +/K 50 +/P 2747 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1779 0 obj +<< +/K 52 +/P 567 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1780 0 obj +<< +/K 56 +/P 571 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1781 0 obj +<< +/K 58 +/P 573 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1782 0 obj +<< +/K 61 +/P 575 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1783 0 obj +<< +/K 64 +/P 577 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1784 0 obj +<< +/K 66 +/P 579 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1785 0 obj +<< +/K 68 +/P 581 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1786 0 obj +<< +/K 71 +/P 583 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1787 0 obj +<< +/K 74 +/P 585 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1788 0 obj +<< +/K 77 +/P 588 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1789 0 obj +<< +/K 79 +/P 590 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1790 0 obj +<< +/K 82 +/P 592 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1791 0 obj +<< +/K 85 +/P 595 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1792 0 obj +<< +/K 87 +/P 597 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1793 0 obj +<< +/K 90 +/P 599 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1794 0 obj +<< +/K 92 +/P 601 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1795 0 obj +<< +/K 95 +/P 604 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1796 0 obj +<< +/K 100 +/P 608 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1797 0 obj +<< +/K 102 +/P 610 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1798 0 obj +<< +/K 105 +/P 613 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1799 0 obj +<< +/K 107 +/P 615 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1800 0 obj +<< +/K 110 +/P 617 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1801 0 obj +<< +/K 113 +/P 619 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1802 0 obj +<< +/K 116 +/P 621 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1803 0 obj +<< +/K 119 +/P 623 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1804 0 obj +<< +/K 122 +/P 625 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1805 0 obj +<< +/K 125 +/P 628 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1806 0 obj +<< +/K 127 +/P 630 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1807 0 obj +<< +/K 130 +/P 632 0 R +/Pg 17 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1808 0 obj +<< +/K 13 +/P 281 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1809 0 obj +<< +/K 14 +/P 282 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1810 0 obj +<< +/K 15 +/P 283 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1811 0 obj +<< +/K 16 +/P 2748 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1812 0 obj +<< +/K 17 +/P 2749 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1813 0 obj +<< +/K 18 +/P 2750 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1814 0 obj +<< +/K 19 +/P 2751 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1815 0 obj +<< +/K 20 +/P 2752 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1816 0 obj +<< +/K 21 +/P 2753 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1817 0 obj +<< +/K 22 +/P 2754 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1818 0 obj +<< +/K 23 +/P 2755 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1819 0 obj +<< +/K 24 +/P 2756 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1820 0 obj +<< +/K 25 +/P 2757 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1821 0 obj +<< +/K 26 +/P 2758 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1822 0 obj +<< +/K 27 +/P 2759 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1823 0 obj +<< +/K 28 +/P 2760 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1824 0 obj +<< +/K 29 +/P 2761 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1825 0 obj +<< +/K 30 +/P 2762 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1826 0 obj +<< +/K 33 +/P 644 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1827 0 obj +<< +/K 35 +/P 646 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1828 0 obj +<< +/K 37 +/P 648 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1829 0 obj +<< +/K 40 +/P 650 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1830 0 obj +<< +/K 42 +/P 652 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1831 0 obj +<< +/K 43 +/P 652 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1832 0 obj +<< +/K 44 +/P 652 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1833 0 obj +<< +/K 45 +/P 652 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1834 0 obj +<< +/K 46 +/P 652 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1835 0 obj +<< +/K 48 +/P 654 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1836 0 obj +<< +/K 50 +/P 656 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1837 0 obj +<< +/K 53 +/P 658 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1838 0 obj +<< +/K 55 +/P 660 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1839 0 obj +<< +/K 58 +/P 662 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1840 0 obj +<< +/K 60 +/P 664 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1841 0 obj +<< +/K 61 +/P 664 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1842 0 obj +<< +/K 62 +/P 664 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1843 0 obj +<< +/K 63 +/P 664 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1844 0 obj +<< +/K 64 +/P 664 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1845 0 obj +<< +/K 65 +/P 664 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1846 0 obj +<< +/K 66 +/P 664 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1847 0 obj +<< +/K 68 +/P 666 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1848 0 obj +<< +/K 70 +/P 668 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1849 0 obj +<< +/K 73 +/P 670 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1850 0 obj +<< +/K 75 +/P 672 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1851 0 obj +<< +/K 77 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1852 0 obj +<< +/K 78 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1853 0 obj +<< +/K 79 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1854 0 obj +<< +/K 80 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1855 0 obj +<< +/K 81 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1856 0 obj +<< +/K 82 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1857 0 obj +<< +/K 83 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1858 0 obj +<< +/K 84 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1859 0 obj +<< +/K 85 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1860 0 obj +<< +/K 86 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1861 0 obj +<< +/K 87 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1862 0 obj +<< +/K 88 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1863 0 obj +<< +/K 89 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1864 0 obj +<< +/K 90 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1865 0 obj +<< +/K 91 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1866 0 obj +<< +/K 92 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1867 0 obj +<< +/K 93 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1868 0 obj +<< +/K 94 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1869 0 obj +<< +/K 95 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1870 0 obj +<< +/K 96 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1871 0 obj +<< +/K 97 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1872 0 obj +<< +/K 98 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1873 0 obj +<< +/K 99 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1874 0 obj +<< +/K 100 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1875 0 obj +<< +/K 101 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1876 0 obj +<< +/K 102 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1877 0 obj +<< +/K 103 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1878 0 obj +<< +/K 104 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1879 0 obj +<< +/K 105 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1880 0 obj +<< +/K 106 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1881 0 obj +<< +/K 107 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1882 0 obj +<< +/K 108 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1883 0 obj +<< +/K 109 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1884 0 obj +<< +/K 110 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1885 0 obj +<< +/K 111 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1886 0 obj +<< +/K 112 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1887 0 obj +<< +/K 113 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1888 0 obj +<< +/K 114 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1889 0 obj +<< +/K 115 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1890 0 obj +<< +/K 116 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1891 0 obj +<< +/K 117 +/P 674 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1892 0 obj +<< +/K 119 +/P 676 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1893 0 obj +<< +/K 121 +/P 678 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1894 0 obj +<< +/K 124 +/P 680 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1895 0 obj +<< +/K 126 +/P 682 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1896 0 obj +<< +/K 128 +/P 684 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1897 0 obj +<< +/K 130 +/P 686 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1898 0 obj +<< +/K 131 +/P 686 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1899 0 obj +<< +/K 132 +/P 686 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1900 0 obj +<< +/K 133 +/P 686 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1901 0 obj +<< +/K 134 +/P 686 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1902 0 obj +<< +/K 135 +/P 686 0 R +/Pg 18 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1903 0 obj +<< +/K 11 +/P 688 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1904 0 obj +<< +/K 13 +/P 690 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1905 0 obj +<< +/K 16 +/P 692 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1906 0 obj +<< +/K 19 +/P 694 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1907 0 obj +<< +/K 21 +/P 696 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1908 0 obj +<< +/K 22 +/P 697 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1909 0 obj +<< +/K 23 +/P 698 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1910 0 obj +<< +/K 24 +/P 284 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1911 0 obj +<< +/K 25 +/P 285 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1912 0 obj +<< +/K 26 +/P 286 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1913 0 obj +<< +/K 27 +/P 287 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1914 0 obj +<< +/K [1915 0 R 28] +/P 2763 0 R +/Pg 19 0 R +/S /Code +/Type /StructElem +>> +endobj +1915 0 obj +<< +/K 29 +/P 1914 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1916 0 obj +<< +/K 30 +/P 2763 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1917 0 obj +<< +/K 31 +/P 2764 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1918 0 obj +<< +/K 32 +/P 2765 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1919 0 obj +<< +/K 33 +/P 2766 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1920 0 obj +<< +/K [1921 0 R 34] +/P 2767 0 R +/Pg 19 0 R +/S /Code +/Type /StructElem +>> +endobj +1921 0 obj +<< +/K 35 +/P 1920 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1922 0 obj +<< +/K 36 +/P 2768 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1923 0 obj +<< +/K 37 +/P 2769 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1924 0 obj +<< +/K 38 +/P 2770 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1925 0 obj +<< +/K 39 +/P 2771 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1926 0 obj +<< +/K 40 +/P 2772 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1927 0 obj +<< +/K 41 +/P 2773 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1928 0 obj +<< +/K 42 +/P 2774 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1929 0 obj +<< +/K [1930 0 R 43] +/P 2775 0 R +/Pg 19 0 R +/S /Code +/Type /StructElem +>> +endobj +1930 0 obj +<< +/K 44 +/P 1929 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1931 0 obj +<< +/K 45 +/P 2775 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1932 0 obj +<< +/K 46 +/P 2776 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1933 0 obj +<< +/K 47 +/P 2777 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1934 0 obj +<< +/K 48 +/P 2778 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1935 0 obj +<< +/K 49 +/P 704 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1936 0 obj +<< +/K 51 +/P 706 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1937 0 obj +<< +/K 53 +/P 707 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1938 0 obj +<< +/K 56 +/P 709 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1939 0 obj +<< +/K 59 +/P 711 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1940 0 obj +<< +/K 61 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1941 0 obj +<< +/K 62 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1942 0 obj +<< +/K 63 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1943 0 obj +<< +/K 64 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1944 0 obj +<< +/K 65 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1945 0 obj +<< +/K 66 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1946 0 obj +<< +/K 67 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1947 0 obj +<< +/K 68 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1948 0 obj +<< +/K 69 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1949 0 obj +<< +/K 70 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1950 0 obj +<< +/K 71 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1951 0 obj +<< +/K 72 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1952 0 obj +<< +/K 73 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1953 0 obj +<< +/K 74 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1954 0 obj +<< +/K 75 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1955 0 obj +<< +/K 76 +/P 713 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1956 0 obj +<< +/K 78 +/P 715 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1957 0 obj +<< +/K 81 +/P 717 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1958 0 obj +<< +/K 83 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1959 0 obj +<< +/K 84 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1960 0 obj +<< +/K 85 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1961 0 obj +<< +/K 86 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1962 0 obj +<< +/K 87 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1963 0 obj +<< +/K 88 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1964 0 obj +<< +/K 89 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1965 0 obj +<< +/K 90 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1966 0 obj +<< +/K 91 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1967 0 obj +<< +/K 92 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1968 0 obj +<< +/K 93 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1969 0 obj +<< +/K 94 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1970 0 obj +<< +/K 95 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1971 0 obj +<< +/K 96 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1972 0 obj +<< +/K 97 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1973 0 obj +<< +/K 98 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1974 0 obj +<< +/K 99 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1975 0 obj +<< +/K 100 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1976 0 obj +<< +/K 101 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1977 0 obj +<< +/K 102 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1978 0 obj +<< +/K 103 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1979 0 obj +<< +/K 104 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1980 0 obj +<< +/K 105 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1981 0 obj +<< +/K 106 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1982 0 obj +<< +/K 107 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1983 0 obj +<< +/K 108 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1984 0 obj +<< +/K 109 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1985 0 obj +<< +/K 110 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1986 0 obj +<< +/K 111 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1987 0 obj +<< +/K 112 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1988 0 obj +<< +/K 113 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1989 0 obj +<< +/K 114 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1990 0 obj +<< +/K 115 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1991 0 obj +<< +/K 116 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1992 0 obj +<< +/K 117 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1993 0 obj +<< +/K 118 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1994 0 obj +<< +/K 119 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1995 0 obj +<< +/K 120 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1996 0 obj +<< +/K 121 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1997 0 obj +<< +/K 122 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1998 0 obj +<< +/K 123 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +1999 0 obj +<< +/K 124 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2000 0 obj +<< +/K 125 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2001 0 obj +<< +/K 126 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2002 0 obj +<< +/K 127 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2003 0 obj +<< +/K 128 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2004 0 obj +<< +/K 129 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2005 0 obj +<< +/K 130 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2006 0 obj +<< +/K 131 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2007 0 obj +<< +/K 132 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2008 0 obj +<< +/K 133 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2009 0 obj +<< +/K 134 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2010 0 obj +<< +/K 135 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2011 0 obj +<< +/K 136 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2012 0 obj +<< +/K 137 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2013 0 obj +<< +/K 138 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2014 0 obj +<< +/K 139 +/P 719 0 R +/Pg 19 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2015 0 obj +<< +/K 12 +/P 719 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2016 0 obj +<< +/K 13 +/P 719 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2017 0 obj +<< +/K 14 +/P 719 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2018 0 obj +<< +/K 15 +/P 719 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2019 0 obj +<< +/K 16 +/P 719 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2020 0 obj +<< +/K 17 +/P 719 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2021 0 obj +<< +/K 20 +/P 721 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2022 0 obj +<< +/K 22 +/P 723 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2023 0 obj +<< +/K 24 +/P 725 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2024 0 obj +<< +/K 26 +/P 726 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2025 0 obj +<< +/K 28 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2026 0 obj +<< +/K 29 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2027 0 obj +<< +/K 30 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2028 0 obj +<< +/K 31 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2029 0 obj +<< +/K 32 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2030 0 obj +<< +/K 33 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2031 0 obj +<< +/K 34 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2032 0 obj +<< +/K 35 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2033 0 obj +<< +/K 36 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2034 0 obj +<< +/K 37 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2035 0 obj +<< +/K 38 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2036 0 obj +<< +/K 39 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2037 0 obj +<< +/K 40 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2038 0 obj +<< +/K 41 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2039 0 obj +<< +/K 42 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2040 0 obj +<< +/K 43 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2041 0 obj +<< +/K 44 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2042 0 obj +<< +/K 45 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2043 0 obj +<< +/K 46 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2044 0 obj +<< +/K 47 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2045 0 obj +<< +/K 48 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2046 0 obj +<< +/K 49 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2047 0 obj +<< +/K 50 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2048 0 obj +<< +/K 51 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2049 0 obj +<< +/K 52 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2050 0 obj +<< +/K 53 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2051 0 obj +<< +/K 54 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2052 0 obj +<< +/K 55 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2053 0 obj +<< +/K 56 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2054 0 obj +<< +/K 57 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2055 0 obj +<< +/K 58 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2056 0 obj +<< +/K 59 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2057 0 obj +<< +/K 60 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2058 0 obj +<< +/K 61 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2059 0 obj +<< +/K 62 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2060 0 obj +<< +/K 63 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2061 0 obj +<< +/K 64 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2062 0 obj +<< +/K 65 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2063 0 obj +<< +/K 66 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2064 0 obj +<< +/K 67 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2065 0 obj +<< +/K 68 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2066 0 obj +<< +/K 69 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2067 0 obj +<< +/K 70 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2068 0 obj +<< +/K 71 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2069 0 obj +<< +/K 72 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2070 0 obj +<< +/K 73 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2071 0 obj +<< +/K 74 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2072 0 obj +<< +/K 75 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2073 0 obj +<< +/K 76 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2074 0 obj +<< +/K 77 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2075 0 obj +<< +/K 78 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2076 0 obj +<< +/K 79 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2077 0 obj +<< +/K 80 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2078 0 obj +<< +/K 81 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2079 0 obj +<< +/K 82 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2080 0 obj +<< +/K 83 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2081 0 obj +<< +/K 84 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2082 0 obj +<< +/K 85 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2083 0 obj +<< +/K 86 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2084 0 obj +<< +/K 87 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2085 0 obj +<< +/K 88 +/P 728 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2086 0 obj +<< +/K 92 +/P 732 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2087 0 obj +<< +/K 94 +/P 734 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2088 0 obj +<< +/K 96 +/P 736 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2089 0 obj +<< +/K 99 +/P 738 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2090 0 obj +<< +/K 101 +/P 740 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2091 0 obj +<< +/K 104 +/P 742 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2092 0 obj +<< +/K 107 +/P 288 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2093 0 obj +<< +/K 108 +/P 289 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2094 0 obj +<< +/K 109 +/P 290 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2095 0 obj +<< +/K 110 +/P 2779 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2096 0 obj +<< +/K 111 +/P 2780 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2097 0 obj +<< +/K 112 +/P 2781 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2098 0 obj +<< +/K 113 +/P 2782 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2099 0 obj +<< +/K 114 +/P 2783 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2100 0 obj +<< +/K 115 +/P 2784 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2101 0 obj +<< +/K 116 +/P 2785 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2102 0 obj +<< +/K 117 +/P 2786 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2103 0 obj +<< +/K 118 +/P 2787 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2104 0 obj +<< +/K 119 +/P 2788 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2105 0 obj +<< +/K 120 +/P 2789 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2106 0 obj +<< +/K 121 +/P 2790 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2107 0 obj +<< +/K 122 +/P 2791 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2108 0 obj +<< +/K 123 +/P 2792 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2109 0 obj +<< +/K 124 +/P 2793 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2110 0 obj +<< +/K 125 +/P 2794 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2111 0 obj +<< +/K 126 +/P 2795 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2112 0 obj +<< +/K 127 +/P 2796 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2113 0 obj +<< +/K 128 +/P 2797 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2114 0 obj +<< +/K 129 +/P 2798 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2115 0 obj +<< +/K 130 +/P 2799 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2116 0 obj +<< +/K 131 +/P 2800 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2117 0 obj +<< +/K 132 +/P 2801 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2118 0 obj +<< +/K 133 +/P 2802 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2119 0 obj +<< +/K 134 +/P 2936 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2120 0 obj +<< +/K 135 +/P 2937 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2121 0 obj +<< +/K 136 +/P 2805 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2122 0 obj +<< +/K 142 +/P 759 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2123 0 obj +<< +/K 147 +/P 763 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2124 0 obj +<< +/K 150 +/P 765 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2125 0 obj +<< +/K 155 +/P 769 0 R +/Pg 20 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2126 0 obj +<< +/K 29 +/P 772 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2127 0 obj +<< +/K 32 +/P 774 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2128 0 obj +<< +/K 35 +/P 776 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2129 0 obj +<< +/K 38 +/P 778 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2130 0 obj +<< +/K 41 +/P 780 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2131 0 obj +<< +/K 44 +/P 783 0 R +/Pg 21 0 R +/S /Lbl +/Type /StructElem +>> +endobj +2132 0 obj +<< +/K [2133 0 R 45] +/P 783 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +2133 0 obj +<< +/K 46 +/P 2132 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2134 0 obj +<< +/K 47 +/P 783 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2135 0 obj +<< +/K [2136 0 R 48] +/P 783 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +2136 0 obj +<< +/K 49 +/P 2135 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2137 0 obj +<< +/K 50 +/P 783 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2138 0 obj +<< +/K 51 +/P 784 0 R +/Pg 21 0 R +/S /Lbl +/Type /StructElem +>> +endobj +2139 0 obj +<< +/K [2140 0 R 52] +/P 784 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +2140 0 obj +<< +/K 53 +/P 2139 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2141 0 obj +<< +/K 54 +/P 784 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2142 0 obj +<< +/K [2143 0 R 55] +/P 784 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +2143 0 obj +<< +/K 56 +/P 2142 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2144 0 obj +<< +/K 57 +/P 784 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2145 0 obj +<< +/K 58 +/P 785 0 R +/Pg 21 0 R +/S /Lbl +/Type /StructElem +>> +endobj +2146 0 obj +<< +/K [2147 0 R 59] +/P 785 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +2147 0 obj +<< +/K 60 +/P 2146 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2148 0 obj +<< +/K 61 +/P 785 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2149 0 obj +<< +/K 62 +/P 786 0 R +/Pg 21 0 R +/S /Lbl +/Type /StructElem +>> +endobj +2150 0 obj +<< +/K 63 +/P 786 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2151 0 obj +<< +/K [2152 0 R 64] +/P 786 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +2152 0 obj +<< +/K 65 +/P 2151 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2153 0 obj +<< +/K 66 +/P 786 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2154 0 obj +<< +/K [2155 0 R 67] +/P 786 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +2155 0 obj +<< +/K 68 +/P 2154 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2156 0 obj +<< +/K 69 +/P 786 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2157 0 obj +<< +/K [2158 0 R 70] +/P 786 0 R +/Pg 21 0 R +/S /Code +/Type /StructElem +>> +endobj +2158 0 obj +<< +/K 71 +/P 2157 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2159 0 obj +<< +/K 72 +/P 786 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2160 0 obj +<< +/K 74 +/P 291 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2161 0 obj +<< +/K 75 +/P 292 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2162 0 obj +<< +/K 76 +/P 293 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2163 0 obj +<< +/K 77 +/P 2806 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2164 0 obj +<< +/K 78 +/P 2807 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2165 0 obj +<< +/K 79 +/P 2808 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2166 0 obj +<< +/K 80 +/P 2809 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2167 0 obj +<< +/K 81 +/P 2810 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2168 0 obj +<< +/K 82 +/P 2811 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2169 0 obj +<< +/K 83 +/P 2812 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2170 0 obj +<< +/K 84 +/P 2813 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2171 0 obj +<< +/K 85 +/P 2814 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2172 0 obj +<< +/K 86 +/P 2815 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2173 0 obj +<< +/K 87 +/P 2816 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2174 0 obj +<< +/K 88 +/P 2817 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2175 0 obj +<< +/K 91 +/P 294 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2176 0 obj +<< +/K 92 +/P 295 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2177 0 obj +<< +/K 93 +/P 296 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2178 0 obj +<< +/K 94 +/P 297 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2179 0 obj +<< +/K 95 +/P 2818 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2180 0 obj +<< +/K 96 +/P 2819 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2181 0 obj +<< +/K 97 +/P 2938 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2182 0 obj +<< +/K 98 +/P 2821 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2183 0 obj +<< +/K 99 +/P 2822 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2184 0 obj +<< +/K 100 +/P 2823 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2185 0 obj +<< +/K 101 +/P 2824 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2186 0 obj +<< +/K 102 +/P 2825 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2187 0 obj +<< +/K 103 +/P 2826 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2188 0 obj +<< +/K 104 +/P 2827 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2189 0 obj +<< +/K 105 +/P 2828 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2190 0 obj +<< +/K 106 +/P 2829 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2191 0 obj +<< +/K 107 +/P 2830 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2192 0 obj +<< +/K 108 +/P 2831 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2193 0 obj +<< +/K 109 +/P 2832 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2194 0 obj +<< +/K 110 +/P 2833 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2195 0 obj +<< +/K 112 +/P 298 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2196 0 obj +<< +/K 113 +/P 299 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2197 0 obj +<< +/K 114 +/P 300 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2198 0 obj +<< +/K 115 +/P 2834 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2199 0 obj +<< +/K 116 +/P 2835 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2200 0 obj +<< +/K 117 +/P 2836 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2201 0 obj +<< +/K 118 +/P 2837 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2202 0 obj +<< +/K 119 +/P 2838 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2203 0 obj +<< +/K 120 +/P 2839 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2204 0 obj +<< +/K 121 +/P 2840 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2205 0 obj +<< +/K 122 +/P 2841 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2206 0 obj +<< +/K 123 +/P 2842 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2207 0 obj +<< +/K 124 +/P 2843 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2208 0 obj +<< +/K 125 +/P 2844 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2209 0 obj +<< +/K 126 +/P 2845 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2210 0 obj +<< +/K 127 +/P 2846 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2211 0 obj +<< +/K 128 +/P 2847 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2212 0 obj +<< +/K 129 +/P 2848 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2213 0 obj +<< +/K 130 +/P 2849 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2214 0 obj +<< +/K 131 +/P 2850 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2215 0 obj +<< +/K 132 +/P 2851 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2216 0 obj +<< +/K 133 +/P 2852 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2217 0 obj +<< +/K 134 +/P 2853 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2218 0 obj +<< +/K 135 +/P 2854 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2219 0 obj +<< +/K [137 << +/MCID 15 +/Pg 22 0 R +/Type /MCR +>>] +/P 301 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2220 0 obj +<< +/K [138 << +/MCID 16 +/Pg 22 0 R +/Type /MCR +>>] +/P 302 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2221 0 obj +<< +/K [139 << +/MCID 17 +/Pg 22 0 R +/Type /MCR +>>] +/P 303 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2222 0 obj +<< +/K 140 +/P 2855 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2223 0 obj +<< +/K 141 +/P 2856 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2224 0 obj +<< +/K 142 +/P 2857 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2225 0 obj +<< +/K 143 +/P 2858 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2226 0 obj +<< +/K 144 +/P 2859 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2227 0 obj +<< +/K 145 +/P 2860 0 R +/Pg 21 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2228 0 obj +<< +/K 18 +/P 2861 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2229 0 obj +<< +/K 19 +/P 2862 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2230 0 obj +<< +/K 20 +/P 2863 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2231 0 obj +<< +/K 21 +/P 2864 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2232 0 obj +<< +/K 22 +/P 2865 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2233 0 obj +<< +/K 23 +/P 2866 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2234 0 obj +<< +/K 24 +/P 2867 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2235 0 obj +<< +/K 25 +/P 2868 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2236 0 obj +<< +/K 26 +/P 2869 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2237 0 obj +<< +/K 27 +/P 2870 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2238 0 obj +<< +/K 28 +/P 2871 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2239 0 obj +<< +/K 29 +/P 2872 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2240 0 obj +<< +/K 31 +/P 304 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2241 0 obj +<< +/K 32 +/P 305 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2242 0 obj +<< +/K 33 +/P 2873 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2243 0 obj +<< +/K 34 +/P 2874 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2244 0 obj +<< +/K 35 +/P 2875 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2245 0 obj +<< +/K 36 +/P 2876 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2246 0 obj +<< +/K 37 +/P 2877 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2247 0 obj +<< +/K 38 +/P 2878 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2248 0 obj +<< +/K 39 +/P 2879 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2249 0 obj +<< +/K 40 +/P 2880 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2250 0 obj +<< +/K 43 +/P 825 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2251 0 obj +<< +/K 45 +/P 827 0 R +/Pg 22 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2252 0 obj +<< +/K 3 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2253 0 obj +<< +/K 4 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2254 0 obj +<< +/K 5 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2255 0 obj +<< +/K 6 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2256 0 obj +<< +/K 7 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2257 0 obj +<< +/K 8 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2258 0 obj +<< +/K 9 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2259 0 obj +<< +/K 10 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2260 0 obj +<< +/K 11 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2261 0 obj +<< +/K 12 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2262 0 obj +<< +/K 13 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2263 0 obj +<< +/K 14 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2264 0 obj +<< +/K 15 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2265 0 obj +<< +/K 16 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2266 0 obj +<< +/K 17 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2267 0 obj +<< +/K 18 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2268 0 obj +<< +/K 19 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2269 0 obj +<< +/K 20 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2270 0 obj +<< +/K 21 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2271 0 obj +<< +/K 22 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2272 0 obj +<< +/K 23 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2273 0 obj +<< +/K 24 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2274 0 obj +<< +/K 25 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2275 0 obj +<< +/K 26 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2276 0 obj +<< +/K 27 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2277 0 obj +<< +/K 28 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2278 0 obj +<< +/K 29 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2279 0 obj +<< +/K 30 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2280 0 obj +<< +/K 31 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2281 0 obj +<< +/K 32 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2282 0 obj +<< +/K 33 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2283 0 obj +<< +/K 34 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2284 0 obj +<< +/K 35 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2285 0 obj +<< +/K 36 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2286 0 obj +<< +/K 37 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2287 0 obj +<< +/K 38 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2288 0 obj +<< +/K 39 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2289 0 obj +<< +/K 40 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2290 0 obj +<< +/K 41 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2291 0 obj +<< +/K 42 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2292 0 obj +<< +/K 43 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2293 0 obj +<< +/K 44 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2294 0 obj +<< +/K 45 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2295 0 obj +<< +/K 46 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2296 0 obj +<< +/K 47 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2297 0 obj +<< +/K 48 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2298 0 obj +<< +/K 49 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2299 0 obj +<< +/K 50 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2300 0 obj +<< +/K 51 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2301 0 obj +<< +/K 52 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2302 0 obj +<< +/K 53 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2303 0 obj +<< +/K 54 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2304 0 obj +<< +/K 55 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2305 0 obj +<< +/K 56 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2306 0 obj +<< +/K 57 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2307 0 obj +<< +/K 58 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2308 0 obj +<< +/K 59 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2309 0 obj +<< +/K 60 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2310 0 obj +<< +/K 61 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2311 0 obj +<< +/K 62 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2312 0 obj +<< +/K 63 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2313 0 obj +<< +/K 64 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2314 0 obj +<< +/K 65 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2315 0 obj +<< +/K 66 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2316 0 obj +<< +/K 67 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2317 0 obj +<< +/K 68 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2318 0 obj +<< +/K 69 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2319 0 obj +<< +/K 70 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2320 0 obj +<< +/K 71 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2321 0 obj +<< +/K 72 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2322 0 obj +<< +/K 73 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2323 0 obj +<< +/K 74 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2324 0 obj +<< +/K 75 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2325 0 obj +<< +/K 76 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2326 0 obj +<< +/K 77 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2327 0 obj +<< +/K 78 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2328 0 obj +<< +/K 79 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2329 0 obj +<< +/K 80 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2330 0 obj +<< +/K 81 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2331 0 obj +<< +/K 82 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2332 0 obj +<< +/K 83 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2333 0 obj +<< +/K 84 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2334 0 obj +<< +/K 85 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2335 0 obj +<< +/K 86 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2336 0 obj +<< +/K 87 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2337 0 obj +<< +/K 88 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2338 0 obj +<< +/K 89 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2339 0 obj +<< +/K 90 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2340 0 obj +<< +/K 91 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2341 0 obj +<< +/K 92 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2342 0 obj +<< +/K 93 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2343 0 obj +<< +/K 94 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2344 0 obj +<< +/K 95 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2345 0 obj +<< +/K 96 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2346 0 obj +<< +/K 97 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2347 0 obj +<< +/K 98 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2348 0 obj +<< +/K 99 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2349 0 obj +<< +/K 100 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2350 0 obj +<< +/K 101 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2351 0 obj +<< +/K 102 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2352 0 obj +<< +/K 103 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2353 0 obj +<< +/K 104 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2354 0 obj +<< +/K 105 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2355 0 obj +<< +/K 106 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2356 0 obj +<< +/K 107 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2357 0 obj +<< +/K 108 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2358 0 obj +<< +/K 109 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2359 0 obj +<< +/K 110 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2360 0 obj +<< +/K 111 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2361 0 obj +<< +/K 112 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2362 0 obj +<< +/K 113 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2363 0 obj +<< +/K 114 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2364 0 obj +<< +/K 115 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2365 0 obj +<< +/K 116 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2366 0 obj +<< +/K 117 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2367 0 obj +<< +/K 118 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2368 0 obj +<< +/K 119 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2369 0 obj +<< +/K 120 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2370 0 obj +<< +/K 121 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2371 0 obj +<< +/K 122 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2372 0 obj +<< +/K 123 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2373 0 obj +<< +/K 124 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2374 0 obj +<< +/K 125 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2375 0 obj +<< +/K 126 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2376 0 obj +<< +/K 127 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2377 0 obj +<< +/K 128 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2378 0 obj +<< +/K 129 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2379 0 obj +<< +/K 130 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2380 0 obj +<< +/K 131 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2381 0 obj +<< +/K 132 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2382 0 obj +<< +/K 133 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2383 0 obj +<< +/K 134 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2384 0 obj +<< +/K 135 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2385 0 obj +<< +/K 136 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2386 0 obj +<< +/K 137 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2387 0 obj +<< +/K 138 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2388 0 obj +<< +/K 139 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2389 0 obj +<< +/K 140 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2390 0 obj +<< +/K 141 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2391 0 obj +<< +/K 142 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2392 0 obj +<< +/K 143 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2393 0 obj +<< +/K 144 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2394 0 obj +<< +/K 145 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2395 0 obj +<< +/K 146 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2396 0 obj +<< +/K 147 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2397 0 obj +<< +/K 148 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2398 0 obj +<< +/K 149 +/P 829 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2399 0 obj +<< +/K 151 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2400 0 obj +<< +/K 152 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2401 0 obj +<< +/K 153 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2402 0 obj +<< +/K 154 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2403 0 obj +<< +/K 155 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2404 0 obj +<< +/K 156 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2405 0 obj +<< +/K 157 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2406 0 obj +<< +/K 158 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2407 0 obj +<< +/K 159 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2408 0 obj +<< +/K 160 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2409 0 obj +<< +/K 161 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2410 0 obj +<< +/K 162 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2411 0 obj +<< +/K 163 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2412 0 obj +<< +/K 164 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2413 0 obj +<< +/K 165 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2414 0 obj +<< +/K 166 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2415 0 obj +<< +/K 167 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2416 0 obj +<< +/K 168 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2417 0 obj +<< +/K 169 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2418 0 obj +<< +/K 170 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2419 0 obj +<< +/K 171 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2420 0 obj +<< +/K 172 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2421 0 obj +<< +/K 173 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2422 0 obj +<< +/K 174 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2423 0 obj +<< +/K 175 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2424 0 obj +<< +/K 176 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2425 0 obj +<< +/K 177 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2426 0 obj +<< +/K 178 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2427 0 obj +<< +/K 179 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2428 0 obj +<< +/K 180 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2429 0 obj +<< +/K 181 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2430 0 obj +<< +/K 182 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2431 0 obj +<< +/K 183 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2432 0 obj +<< +/K 184 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2433 0 obj +<< +/K 185 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2434 0 obj +<< +/K 186 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2435 0 obj +<< +/K 187 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2436 0 obj +<< +/K 188 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2437 0 obj +<< +/K 189 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2438 0 obj +<< +/K 190 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2439 0 obj +<< +/K 191 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2440 0 obj +<< +/K 192 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2441 0 obj +<< +/K 193 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2442 0 obj +<< +/K 194 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2443 0 obj +<< +/K 195 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2444 0 obj +<< +/K 196 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2445 0 obj +<< +/K 197 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2446 0 obj +<< +/K 198 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2447 0 obj +<< +/K 199 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2448 0 obj +<< +/K 200 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2449 0 obj +<< +/K 201 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2450 0 obj +<< +/K 202 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2451 0 obj +<< +/K 203 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2452 0 obj +<< +/K 204 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2453 0 obj +<< +/K 205 +/P 831 0 R +/Pg 23 0 R +/S /NonStruct +/Type /StructElem +>> +endobj +2454 0 obj +<< +/BBox [51.933987 682.937256 147.702927 692.912842] +/Filter /FlateDecode +/Group << +/I false +/K false +/S /Transparency +>> +/Length 28 +/Matrix [1 0 0 1 -51.933987 -682.937256] +/Resources << +/ExtGState << +/GS0 2939 0 R +>> +/XObject << +/Fm0 2940 0 R +>> +>> +/Subtype /Form +/Type /XObject +>> +stream +xw6PH/V(w5Pp +5V +endstream +endobj +2455 0 obj +<< +/BBox [147.848251 682.937256 215.557983 692.912842] +/Filter /FlateDecode +/Group << +/I false +/K false +/S /Transparency +>> +/Length 28 +/Matrix [1 0 0 1 -147.848251 -682.937256] +/Resources << +/ExtGState << +/GS0 2941 0 R +>> +/XObject << +/Fm0 2942 0 R +>> +>> +/Subtype /Form +/Type /XObject +>> +stream +xw6PH/V(w5Pp +5V +endstream +endobj +2456 0 obj +<< +/BaseFont /AAAAAA+MalgunGothicBold +/CIDSystemInfo << +/Ordering (Identity) +/Registry (Adobe) +/Supplement 0 +>> +/CIDToGIDMap /Identity +/DW 1000 +/FontDescriptor 2943 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 [662.59766 0 0 351.5625 0 607.91016] 10 11 357.91016 13 [719.23828 261.71875 413.57422 261.71875 438.96484] 18 27 579.58984 28 [261.71875] 35 [703.61328 637.20703 638.67188 745.60547 538.57422 524.41406 722.16797 769.53125 310.05859 0 645.01953 512.20703 964.35547 797.85156 776.36719 614.74609 +776.36719 653.80859 565.91797 582.51953 730.95703 670.89844 1009.76563 653.32031 606.44531] 65 [425.78125 0 542.96875 626.46484 487.30469 625.97656 549.80469 372.55859 625.97656 606.93359 274.41406 279.29688 555.17578 274.41406 923.33984 608.39844 +619.62891 626.46484 0 393.55469 461.91406 384.27734 608.39844 536.62109 795.41016 538.57422 535.64453] +96 [719.23828] 283 [1025.87891]] +>> +endobj +2457 0 obj +<< +/Filter /FlateDecode +/Length 1404 +>> +stream +x]n9z>&@V \fx˂? rO,b{_t^mz>M_ygx:ׇ>vwwӴk{9߮ߦeq=ne>~^.n6~:nϻ}6q;No>ǟl 6v/Ot~vw""ݺn;Y7"~I ȯ t2OwiN&͠rf%REJD-قkٓ\p,^rBƵՓJ_hi³ +UAF;-: 5P$q_N3[{|43זbv~99${B@7Whq!U%+Cb(Sgt1ؖ@g8b z>q9fj)+"~ ސV!-$Т62(P1$O-Ұ`/)KԀ;]*!NqǂpsWn0\caIVz<4B ^l̨&%u}6zi&Sp*9um=ʹ٬p1&WxfY/#Rs!<+1> +/CIDToGIDMap /Identity +/DW 1000 +/FontDescriptor 2944 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 [662.59766 0 0 351.5625 289.0625 395.01953 606.44531 0 0 817.87109 0 304.6875 304.6875 0 700.68359 218.75 +410.15625 218.75 395.99609] 19 28 550.78125 29 [218.75 0 0 700.68359 0 459.96094 0 658.20313 583.49609 634.76563 717.28516 517.08984 498.53516 701.66016 724.60938 270.01953 +359.86328 590.33203 479.98047 916.99219 765.13672 773.4375 570.80078 773.4375 609.86328 542.96875 533.69141 702.63672 634.27734 953.61328 601.07422] 66 [425.78125 0 520.01953 600.58594 472.65625 602.05078 535.15625 316.40625 602.05078 578.61328 246.09375 246.09375 505.85938 246.09375 879.88281 578.125 +599.12109 600.58594 602.05078 353.51563 433.10547 344.72656 578.125 487.30469 736.32813 464.84375 492.67578 461.91406 0 0 0 700.68359] 280 [1025.87891] 336 [700.68359] 539 [589.84375] 549 +551 950.19531] +>> +endobj +2459 0 obj +<< +/Filter /FlateDecode +/Length 1795 +>> +stream +xen9u>4D&w@%a@V=%,?N9X%F]׏?oo/Orۿ}O.$}~Ƿ|zyz^_οџ~==}u~|?ߞu?io?xϋآeߞ_ӽ1}~Mޘ%>m"(ZQZ6?c( erpe}KڍVD ABE-Ո2q^D} +ґee@ Vn9aqxi2W>n4sF s-C JC]+ٰz`_9lo@K3)Ջ*j/Q#lNm! +*/Z[6}B. B:A4)CKST K/)ǭR!N~*Vӛ (VRKX >{K(8Y!8N$%wdfBԾ&ie\RN(ywKsH!BFJG|TZVP8aY$:iSYc{h.B B[G榸nۜ}n2+WmQ޺ ܉h" u)DR@#zeXɩY"ѱ'Y72+CX +Jn}5hu@~RXͮaC7 + *~uv¾-B d,ԡ "b<þI b%B9tYsʛP%R\DyMzz2:u` be/P ONn6VInڗ sۤ +IJ֋ӣN˜ 4|"IFY#e| [|kXIdߠӉ}Xf(/q3K;JӢ$I2Ӵ(E)\Rg󈳜us+D"Dzzx5sE +47Iն lNDHb@ +51/"oYl(Rl<DE)AҥN--zM+X۹͢7l(;ҥ`(#BJ낞}=|"ǿBqYqCuP\V޲IԨFGoR7T*U.97D^IEDPW52ì:vFO8F'sevjNꢦEz.  MS;aesМJGծ B>Ik7}><#Mӛ"7ID dm 1EfdCj 2p[g QڂR9*#/qGLDmn0qZ8-RqZDLÈ zD#Afg`Ѡ`g\QcOƠ0[ũQUDKf3iv R ? 5q}L4@lRD؞Ar1DQ W;>{9W f޵4W7-"ru,:A}l 2A9$w UW)Bi,M>hS-3 YWYTWâ42B i|;\'^߈a_?C~9~y~: ~ +endstream +endobj +2460 0 obj +<< +/Filter /FlateDecode +/Length 84 +>> +stream +xU;0 C ԡSA6xXnS `qV$o=x>[|y;C.~ +endstream +endobj +2461 0 obj +<< +/Length 35 +>> +stream +2812 0 d0 +1 0 0 1 0 0 cm +/XgF4C Do + +endstream +endobj +2462 0 obj +<< +/Length 35 +>> +stream +2812 0 d0 +1 0 0 1 0 0 cm +/XgF7C Do + +endstream +endobj +2463 0 obj +<< +/Length 35 +>> +stream +2812 0 d0 +1 0 0 1 0 0 cm +/XgFA2 Do + +endstream +endobj +2464 0 obj +<< +/CapHeight 1434 +/Flags 4 +/FontFamily (Segoe UI Emoji) +/FontName /CAAAAA+SegoeUIEmoji +/FontStretch /Normal +/FontWeight 400 +/ItalicAngle 0 +/StemV 109 +/Type /FontDescriptor +/XHeight 1024 +>> +endobj +2465 0 obj +<< +/BBox [0 0 2091 1804] +/Filter /FlateDecode +/Group << +/I true +/S /Transparency +/Type /Group +>> +/Length 851 +/Matrix [1 0 0 1 369 -1517] +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Pattern << +/P2917 2945 0 R +/P2922 2946 0 R +/P2927 2947 0 R +/P2932 2948 0 R +/P2937 2949 0 R +/P2942 2950 0 R +/P2947 2951 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +xUnI +ߏ؁}>;H}؎d{kIYUynE@ +/_gxje +Q*wBn 5J36I4JnQȭ15O;,XaL%(2*}ީ ikĶg$ ZU9ꗯr}Lͳ*-:=BCqvȝ٫{el,f90+f6 + u {3]VlW_bo;^ڹzj81 +endstream +endobj +2466 0 obj +<< +/BBox [0 0 2050 2050] +/Filter /FlateDecode +/Group << +/I true +/S /Transparency +/Type /Group +>> +/Length 749 +/Matrix [1 0 0 1 369 -1763] +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Pattern << +/P2950 2952 0 R +/P2955 2953 0 R +/P2960 2954 0 R +/P2965 2955 0 R +/P2970 2956 0 R +/P2975 2957 0 R +/P2980 2958 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +xTnFSjޏڅ؅$@RdAΞyۂhi^axYX"+PyQPi@BsW(n␾[Ĵvru!Fܘ9'8T쁢m8_(s~i Np7,+F^Q"7a(sB1RteWTt|G *cTRBկz11mh\+oD.ucH_?>§o~<~2o~߬uy,+@F9_O)퐲R>|Rc+O)ߵV>|Rc+ǹO)ߵV>|Rc+ʿ[0?jƒx /KLVZ@g9C6ps6xhXA/KsbA3<4BpAblRQ(B !u>wPOY:NlQU|If5Btu" +(:YfO҈K!fdwP*U))NhTp+bv-EQE.W +endstream +endobj +2467 0 obj +<< +/BBox [0 0 2091 2091] +/Filter /FlateDecode +/Group << +/I true +/S /Transparency +/Type /Group +>> +/Length 720 +/Matrix [1 0 0 1 369 -1763] +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Pattern << +/P2983 2959 0 R +/P2988 2960 0 R +/P2993 2961 0 R +/P2998 2962 0 R +/P3003 2963 0 R +/P3008 2964 0 R +/P3013 2965 0 R +/P3018 2966 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +x헹0 @{}C:E`-R&)& D&u`DD| !(-eSQK@ǺTKdK{@(7*yh|,"9-k1IKD2 ٴ#whUΖTass AN->eSV#eڲi#o{7T" q:\%-BVFl'jZ"VJ)+-)-/iˮ8 N`곁i4p) `i4p8 Jhುi4p- p賁i4p/ l2痐 +endstream +endobj +2468 0 obj +<< +/Filter /FlateDecode +/Length 244 +>> +stream +x]Pj0W19n B@>+%!}RaYvf]&Iy}`Z;oMaNyTu&թ]L}' niޓl9g@:鑐NYewkMk,MQJYyopUt (7OJ) ǺGY> +/CIDToGIDMap /Identity +/DW 0 +/FontDescriptor 2967 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 869 549.80469] +>> +endobj +2470 0 obj +<< +/Filter /FlateDecode +/Length 414 +>> +stream +x]n@}LJɆ qECRܠ6>GߓHssQ57&ϳ<ݖI2;q ĿuXETwMmtye)e.mt=藟"YD}]?JnJT,ǰ$#{&rۼ=^4݌DuBTJJm۶ 7g7Ncn+Y*eT%J2%f# +z5Liٖ)K` 3JL9<crSl9(ЙL"+DfR4^,+a! W0G`P!mW0@ j *hnJASOnK +ï gҲ :11f0mx#=gG_˺{%9 +endstream +endobj +2471 0 obj +<< +/BaseFont /EAAAAA+GulimChe +/CIDSystemInfo << +/Ordering (Identity) +/Registry (Adobe) +/Supplement 0 +>> +/CIDToGIDMap /Identity +/DW 1000 +/FontDescriptor 2968 0 R +/Subtype /CIDFontType2 +/Type /Font +>> +endobj +2472 0 obj +<< +/Filter /FlateDecode +/Length 952 +>> +stream +x]n9E^&@|6I@@@|,=-AUL6pt.VZvu帟y98OyYi3zֲ[/f_1|ʧyvoe]W:/A4?up;|],}\59^Npoe^mRj;lZkmoV~OFW&RN^2@"iPNEvKvæh:ֵbӤʊEeEY?HjyDqQF@UHsFAM",e,H!!f2&hBO A#*|1 _Ɠ*=t 22 -yJTWQbGeerVPYTZfXJYYW> +/CIDToGIDMap /Identity +/DW 1000 +/FontDescriptor 2969 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 [662.59766 0 0 351.5625] 43 [310.05859] 54 [582.51953 0 0 1009.76563]] +>> +endobj +2474 0 obj +<< +/Filter /FlateDecode +/Length 354 +>> +stream +x]K0{~C1>R$q VǮe҅=(|da&iN7-z';87#> +stream +xeM09p&H}:zmF&~ 2t@XP0_v8L-%`rb੭ᰬV.`" @V9E +,b-y?Y\<^Z֛Y8D,`ZFF *?%^ŁWi6Ռ?·"6me> ֆm1 +endstream +endobj +2476 0 obj +<< +/Length 35 +>> +stream +2812 0 d0 +1 0 0 1 0 0 cm +/XgF4C Do + +endstream +endobj +2477 0 obj +<< +/CapHeight 1434 +/Flags 4 +/FontFamily (Segoe UI Emoji) +/FontName /GAAAAA+SegoeUIEmoji +/FontStretch /Normal +/FontWeight 400 +/ItalicAngle 0 +/StemV 109 +/Type /FontDescriptor +/XHeight 1024 +>> +endobj +2478 0 obj +<< +/BBox [0 0 2091 1804] +/Filter /FlateDecode +/Group << +/I true +/S /Transparency +/Type /Group +>> +/Length 851 +/Matrix [1 0 0 1 369 -1517] +/Resources << +/ExtGState << +/G3 224 0 R +>> +/Pattern << +/P2917 2945 0 R +/P2922 2946 0 R +/P2927 2947 0 R +/P2932 2948 0 R +/P2937 2949 0 R +/P2942 2950 0 R +/P2947 2951 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +xUnI +ߏ؁}>;H}؎d{kIYUynE@ +/_gxje +Q*wBn 5J36I4JnQȭ15O;,XaL%(2*}ީ ikĶg$ ZU9ꗯr}Lͳ*-:=BCqvȝ٫{el,f90+f6 + u {3]VlW_bo;^ڹzj81 +endstream +endobj +2479 0 obj +<< +/Filter /FlateDecode +/Length 227 +>> +stream +x]Pj0 +tli;@Raݘpl%5,qC~  CKuQ3 'pK=رmPv2q.z3N89vgz3&O#RK8!ehXׁÁqfL!e]?ڊnlp8Gc1@\Crv$&NT6-i.)!Z(=C1Ģ*n +endstream +endobj +2480 0 obj +<< +/BaseFont /HAAAAA+Consolas-Bold +/CIDSystemInfo << +/Ordering (Identity) +/Registry (Adobe) +/Supplement 0 +>> +/CIDToGIDMap /Identity +/DW 0 +/FontDescriptor 2970 0 R +/Subtype /CIDFontType2 +/Type /Font +/W [0 591 549.80469] +>> +endobj +2481 0 obj +<< +/Filter /FlateDecode +/Length 295 +>> +stream +x]j0 ~ +Cm +!Х ?,8!o?lu`OOx՜=7=(tsኃ6,IAio9v9qlL?8ٻVG5]qS`u5ox,AaxٷnD1m(4^es?yi䄺v]gdBPu] k/:yVB!.- Qi/Hd[EJ2H[Wz,%u#)){uRVcfw& >h'J +endstream +endobj +2482 0 obj +<< +/K 832 0 R +/P 307 0 R +/S /Strong +/Type /StructElem +>> +endobj +2483 0 obj +<< +/K 834 0 R +/P 307 0 R +/S /Strong +/Type /StructElem +>> +endobj +2484 0 obj +<< +/K 836 0 R +/P 307 0 R +/S /Strong +/Type /StructElem +>> +endobj +2485 0 obj +<< +/K 838 0 R +/P 307 0 R +/S /Strong +/Type /StructElem +>> +endobj +2486 0 obj +<< +/K 841 0 R +/P 309 0 R +/S /Link +/Type /StructElem +>> +endobj +2487 0 obj +<< +/K 843 0 R +/P 310 0 R +/S /Link +/Type /StructElem +>> +endobj +2488 0 obj +<< +/K 845 0 R +/P 311 0 R +/S /Link +/Type /StructElem +>> +endobj +2489 0 obj +<< +/K 847 0 R +/P 312 0 R +/S /Link +/Type /StructElem +>> +endobj +2490 0 obj +<< +/K 849 0 R +/P 313 0 R +/S /Link +/Type /StructElem +>> +endobj +2491 0 obj +<< +/K 851 0 R +/P 314 0 R +/S /Link +/Type /StructElem +>> +endobj +2492 0 obj +<< +/K 853 0 R +/P 315 0 R +/S /Link +/Type /StructElem +>> +endobj +2493 0 obj +<< +/K 855 0 R +/P 316 0 R +/S /Link +/Type /StructElem +>> +endobj +2494 0 obj +<< +/A [<< +/Headers [(node00001886)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 872 0 R +/P 344 0 R +/S /TD +/Type /StructElem +>> +endobj +2495 0 obj +<< +/A [<< +/Headers [(node00001887)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 874 0 R +/P 344 0 R +/S /TD +/Type /StructElem +>> +endobj +2496 0 obj +<< +/A [<< +/Headers [(node00001888)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 875 0 R +/P 344 0 R +/S /TD +/Type /StructElem +>> +endobj +2497 0 obj +<< +/A [<< +/Headers [(node00001889)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2881 0 R +/P 344 0 R +/S /TD +/Type /StructElem +>> +endobj +2498 0 obj +<< +/A [<< +/Headers [(node00001890)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 877 0 R +/P 344 0 R +/S /TD +/Type /StructElem +>> +endobj +2499 0 obj +<< +/A [<< +/Headers [(node00001886)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 878 0 R +/P 345 0 R +/S /TD +/Type /StructElem +>> +endobj +2500 0 obj +<< +/A [<< +/Headers [(node00001887)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 880 0 R +/P 345 0 R +/S /TD +/Type /StructElem +>> +endobj +2501 0 obj +<< +/A [<< +/Headers [(node00001888)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 881 0 R +/P 345 0 R +/S /TD +/Type /StructElem +>> +endobj +2502 0 obj +<< +/A [<< +/Headers [(node00001889)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2882 0 R +/P 345 0 R +/S /TD +/Type /StructElem +>> +endobj +2503 0 obj +<< +/A [<< +/Headers [(node00001890)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 883 0 R +/P 345 0 R +/S /TD +/Type /StructElem +>> +endobj +2504 0 obj +<< +/A [<< +/Headers [(node00001886)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 884 0 R +/P 346 0 R +/S /TD +/Type /StructElem +>> +endobj +2505 0 obj +<< +/A [<< +/Headers [(node00001887)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 886 0 R +/P 346 0 R +/S /TD +/Type /StructElem +>> +endobj +2506 0 obj +<< +/A [<< +/Headers [(node00001888)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 887 0 R +/P 346 0 R +/S /TD +/Type /StructElem +>> +endobj +2507 0 obj +<< +/A [<< +/Headers [(node00001889)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2883 0 R +/P 346 0 R +/S /TD +/Type /StructElem +>> +endobj +2508 0 obj +<< +/A [<< +/Headers [(node00001890)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 889 0 R +/P 346 0 R +/S /TD +/Type /StructElem +>> +endobj +2509 0 obj +<< +/A [<< +/Headers [(node00001886)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 890 0 R +/P 347 0 R +/S /TD +/Type /StructElem +>> +endobj +2510 0 obj +<< +/A [<< +/Headers [(node00001887)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 892 0 R +/P 347 0 R +/S /TD +/Type /StructElem +>> +endobj +2511 0 obj +<< +/A [<< +/Headers [(node00001888)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 893 0 R +/P 347 0 R +/S /TD +/Type /StructElem +>> +endobj +2512 0 obj +<< +/A [<< +/Headers [(node00001889)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2884 0 R +/P 347 0 R +/S /TD +/Type /StructElem +>> +endobj +2513 0 obj +<< +/A [<< +/Headers [(node00001890)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 895 0 R +/P 347 0 R +/S /TD +/Type /StructElem +>> +endobj +2514 0 obj +<< +/A [<< +/Headers [(node00001886)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 896 0 R +/P 348 0 R +/S /TD +/Type /StructElem +>> +endobj +2515 0 obj +<< +/A [<< +/Headers [(node00001887)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 898 0 R +/P 348 0 R +/S /TD +/Type /StructElem +>> +endobj +2516 0 obj +<< +/A [<< +/Headers [(node00001888)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 899 0 R +/P 348 0 R +/S /TD +/Type /StructElem +>> +endobj +2517 0 obj +<< +/A [<< +/Headers [(node00001889)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2885 0 R +/P 348 0 R +/S /TD +/Type /StructElem +>> +endobj +2518 0 obj +<< +/A [<< +/Headers [(node00001890)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 901 0 R +/P 348 0 R +/S /TD +/Type /StructElem +>> +endobj +2519 0 obj +<< +/A [<< +/Headers [(node00001886)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 902 0 R +/P 349 0 R +/S /TD +/Type /StructElem +>> +endobj +2520 0 obj +<< +/A [<< +/Headers [(node00001887)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 904 0 R +/P 349 0 R +/S /TD +/Type /StructElem +>> +endobj +2521 0 obj +<< +/A [<< +/Headers [(node00001888)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 905 0 R +/P 349 0 R +/S /TD +/Type /StructElem +>> +endobj +2522 0 obj +<< +/A [<< +/Headers [(node00001889)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2886 0 R +/P 349 0 R +/S /TD +/Type /StructElem +>> +endobj +2523 0 obj +<< +/A [<< +/Headers [(node00001890)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 907 0 R +/P 349 0 R +/S /TD +/Type /StructElem +>> +endobj +2524 0 obj +<< +/A [<< +/Headers [(node00001944)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 912 0 R +/P 352 0 R +/S /TD +/Type /StructElem +>> +endobj +2525 0 obj +<< +/A [<< +/Headers [(node00001945)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 914 0 R +/P 352 0 R +/S /TD +/Type /StructElem +>> +endobj +2526 0 obj +<< +/A [<< +/Headers [(node00001946)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2887 0 R +/P 352 0 R +/S /TD +/Type /StructElem +>> +endobj +2527 0 obj +<< +/A [<< +/Headers [(node00001947)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 916 0 R +/P 352 0 R +/S /TD +/Type /StructElem +>> +endobj +2528 0 obj +<< +/A [<< +/Headers [(node00001944)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 917 0 R +/P 353 0 R +/S /TD +/Type /StructElem +>> +endobj +2529 0 obj +<< +/A [<< +/Headers [(node00001945)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 919 0 R +/P 353 0 R +/S /TD +/Type /StructElem +>> +endobj +2530 0 obj +<< +/A [<< +/Headers [(node00001946)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2888 0 R +/P 353 0 R +/S /TD +/Type /StructElem +>> +endobj +2531 0 obj +<< +/A [<< +/Headers [(node00001947)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 921 0 R +/P 353 0 R +/S /TD +/Type /StructElem +>> +endobj +2532 0 obj +<< +/A [<< +/Headers [(node00001944)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 922 0 R +/P 354 0 R +/S /TD +/Type /StructElem +>> +endobj +2533 0 obj +<< +/A [<< +/Headers [(node00001945)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 924 0 R +/P 354 0 R +/S /TD +/Type /StructElem +>> +endobj +2534 0 obj +<< +/A [<< +/Headers [(node00001946)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2889 0 R +/P 354 0 R +/S /TD +/Type /StructElem +>> +endobj +2535 0 obj +<< +/A [<< +/Headers [(node00001947)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 926 0 R +/P 354 0 R +/S /TD +/Type /StructElem +>> +endobj +2536 0 obj +<< +/A [<< +/Headers [(node00001944)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 927 0 R +/P 355 0 R +/S /TD +/Type /StructElem +>> +endobj +2537 0 obj +<< +/A [<< +/Headers [(node00001945)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 929 0 R +/P 355 0 R +/S /TD +/Type /StructElem +>> +endobj +2538 0 obj +<< +/A [<< +/Headers [(node00001946)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2890 0 R +/P 355 0 R +/S /TD +/Type /StructElem +>> +endobj +2539 0 obj +<< +/A [<< +/Headers [(node00001947)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 931 0 R +/P 355 0 R +/S /TD +/Type /StructElem +>> +endobj +2540 0 obj +<< +/A [<< +/Headers [(node00001944)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 932 0 R +/P 356 0 R +/S /TD +/Type /StructElem +>> +endobj +2541 0 obj +<< +/A [<< +/Headers [(node00001945)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 934 0 R +/P 356 0 R +/S /TD +/Type /StructElem +>> +endobj +2542 0 obj +<< +/A [<< +/Headers [(node00001946)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2891 0 R +/P 356 0 R +/S /TD +/Type /StructElem +>> +endobj +2543 0 obj +<< +/A [<< +/Headers [(node00001947)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 936 0 R +/P 356 0 R +/S /TD +/Type /StructElem +>> +endobj +2544 0 obj +<< +/A [<< +/Headers [(node00001944)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 937 0 R +/P 357 0 R +/S /TD +/Type /StructElem +>> +endobj +2545 0 obj +<< +/A [<< +/Headers [(node00001945)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 939 0 R +/P 357 0 R +/S /TD +/Type /StructElem +>> +endobj +2546 0 obj +<< +/A [<< +/Headers [(node00001946)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2892 0 R +/P 357 0 R +/S /TD +/Type /StructElem +>> +endobj +2547 0 obj +<< +/A [<< +/Headers [(node00001947)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 941 0 R +/P 357 0 R +/S /TD +/Type /StructElem +>> +endobj +2548 0 obj +<< +/A [<< +/Headers [(node00001944)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 942 0 R +/P 358 0 R +/S /TD +/Type /StructElem +>> +endobj +2549 0 obj +<< +/A [<< +/Headers [(node00001945)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 944 0 R +/P 358 0 R +/S /TD +/Type /StructElem +>> +endobj +2550 0 obj +<< +/A [<< +/Headers [(node00001946)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2893 0 R +/P 358 0 R +/S /TD +/Type /StructElem +>> +endobj +2551 0 obj +<< +/A [<< +/Headers [(node00001947)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 946 0 R +/P 358 0 R +/S /TD +/Type /StructElem +>> +endobj +2552 0 obj +<< +/A [<< +/Headers [(node00001944)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 947 0 R +/P 359 0 R +/S /TD +/Type /StructElem +>> +endobj +2553 0 obj +<< +/A [<< +/Headers [(node00001945)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 949 0 R +/P 359 0 R +/S /TD +/Type /StructElem +>> +endobj +2554 0 obj +<< +/A [<< +/Headers [(node00001946)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2894 0 R +/P 359 0 R +/S /TD +/Type /StructElem +>> +endobj +2555 0 obj +<< +/A [<< +/Headers [(node00001947)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 951 0 R +/P 359 0 R +/S /TD +/Type /StructElem +>> +endobj +2556 0 obj +<< +/A [<< +/Headers [(node00001944)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 952 0 R +/P 360 0 R +/S /TD +/Type /StructElem +>> +endobj +2557 0 obj +<< +/A [<< +/Headers [(node00001945)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 954 0 R +/P 360 0 R +/S /TD +/Type /StructElem +>> +endobj +2558 0 obj +<< +/A [<< +/Headers [(node00001946)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2895 0 R +/P 360 0 R +/S /TD +/Type /StructElem +>> +endobj +2559 0 obj +<< +/A [<< +/Headers [(node00001947)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 956 0 R +/P 360 0 R +/S /TD +/Type /StructElem +>> +endobj +2560 0 obj +<< +/A [<< +/Headers [(node00001944)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 957 0 R +/P 361 0 R +/S /TD +/Type /StructElem +>> +endobj +2561 0 obj +<< +/A [<< +/Headers [(node00001945)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 959 0 R +/P 361 0 R +/S /TD +/Type /StructElem +>> +endobj +2562 0 obj +<< +/A [<< +/Headers [(node00001946)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2896 0 R +/P 361 0 R +/S /TD +/Type /StructElem +>> +endobj +2563 0 obj +<< +/A [<< +/Headers [(node00001947)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 961 0 R +/P 361 0 R +/S /TD +/Type /StructElem +>> +endobj +2564 0 obj +<< +/A [<< +/Headers [(node00002266)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1203 0 R 1205 0 R] +/P 383 0 R +/S /TD +/Type /StructElem +>> +endobj +2565 0 obj +<< +/A [<< +/Headers [(node00002267)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1206 0 R +/P 383 0 R +/S /TD +/Type /StructElem +>> +endobj +2566 0 obj +<< +/A [<< +/Headers [(node00002268)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [2897 0 R 1208 0 R] +/P 383 0 R +/S /TD +/Type /StructElem +>> +endobj +2567 0 obj +<< +/A [<< +/Headers [(node00002269)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2898 0 R +/P 383 0 R +/S /TD +/Type /StructElem +>> +endobj +2568 0 obj +<< +/A [<< +/Headers [(node00002266)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1210 0 R 1212 0 R 1213 0 R] +/P 384 0 R +/S /TD +/Type /StructElem +>> +endobj +2569 0 obj +<< +/A [<< +/Headers [(node00002267)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1215 0 R +/P 384 0 R +/S /TD +/Type /StructElem +>> +endobj +2570 0 obj +<< +/A [<< +/Headers [(node00002268)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1216 0 R +/P 384 0 R +/S /TD +/Type /StructElem +>> +endobj +2571 0 obj +<< +/A [<< +/Headers [(node00002269)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2899 0 R +/P 384 0 R +/S /TD +/Type /StructElem +>> +endobj +2572 0 obj +<< +/A [<< +/Headers [(node00002266)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1218 0 R +/P 385 0 R +/S /TD +/Type /StructElem +>> +endobj +2573 0 obj +<< +/A [<< +/Headers [(node00002267)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1220 0 R +/P 385 0 R +/S /TD +/Type /StructElem +>> +endobj +2574 0 obj +<< +/A [<< +/Headers [(node00002268)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1221 0 R +/P 385 0 R +/S /TD +/Type /StructElem +>> +endobj +2575 0 obj +<< +/A [<< +/Headers [(node00002269)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2900 0 R +/P 385 0 R +/S /TD +/Type /StructElem +>> +endobj +2576 0 obj +<< +/A [<< +/Headers [(node00002266)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1223 0 R +/P 386 0 R +/S /TD +/Type /StructElem +>> +endobj +2577 0 obj +<< +/A [<< +/Headers [(node00002267)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1225 0 R +/P 386 0 R +/S /TD +/Type /StructElem +>> +endobj +2578 0 obj +<< +/A [<< +/Headers [(node00002268)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1226 0 R +/P 386 0 R +/S /TD +/Type /StructElem +>> +endobj +2579 0 obj +<< +/A [<< +/Headers [(node00002269)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2901 0 R +/P 386 0 R +/S /TD +/Type /StructElem +>> +endobj +2580 0 obj +<< +/A [<< +/Headers [(node00002266)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1228 0 R +/P 387 0 R +/S /TD +/Type /StructElem +>> +endobj +2581 0 obj +<< +/A [<< +/Headers [(node00002267)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1230 0 R +/P 387 0 R +/S /TD +/Type /StructElem +>> +endobj +2582 0 obj +<< +/A [<< +/Headers [(node00002268)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1231 0 R +/P 387 0 R +/S /TD +/Type /StructElem +>> +endobj +2583 0 obj +<< +/A [<< +/Headers [(node00002269)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2902 0 R +/P 387 0 R +/S /TD +/Type /StructElem +>> +endobj +2584 0 obj +<< +/A [<< +/Headers [(node00002266)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1233 0 R 1235 0 R 1236 0 R] +/P 388 0 R +/S /TD +/Type /StructElem +>> +endobj +2585 0 obj +<< +/A [<< +/Headers [(node00002267)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1238 0 R +/P 388 0 R +/S /TD +/Type /StructElem +>> +endobj +2586 0 obj +<< +/A [<< +/Headers [(node00002268)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1239 0 R +/P 388 0 R +/S /TD +/Type /StructElem +>> +endobj +2587 0 obj +<< +/A [<< +/Headers [(node00002269)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2903 0 R +/P 388 0 R +/S /TD +/Type /StructElem +>> +endobj +2588 0 obj +<< +/A [<< +/Headers [(node00002266)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1241 0 R 1243 0 R 1244 0 R] +/P 389 0 R +/S /TD +/Type /StructElem +>> +endobj +2589 0 obj +<< +/A [<< +/Headers [(node00002267)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1246 0 R +/P 389 0 R +/S /TD +/Type /StructElem +>> +endobj +2590 0 obj +<< +/A [<< +/Headers [(node00002268)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1247 0 R +/P 389 0 R +/S /TD +/Type /StructElem +>> +endobj +2591 0 obj +<< +/A [<< +/Headers [(node00002269)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2904 0 R +/P 389 0 R +/S /TD +/Type /StructElem +>> +endobj +2592 0 obj +<< +/A [<< +/Headers [(node00002266)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1249 0 R 1251 0 R 1252 0 R] +/P 390 0 R +/S /TD +/Type /StructElem +>> +endobj +2593 0 obj +<< +/A [<< +/Headers [(node00002267)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1254 0 R +/P 390 0 R +/S /TD +/Type /StructElem +>> +endobj +2594 0 obj +<< +/A [<< +/Headers [(node00002268)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1255 0 R +/P 390 0 R +/S /TD +/Type /StructElem +>> +endobj +2595 0 obj +<< +/A [<< +/Headers [(node00002269)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2905 0 R +/P 390 0 R +/S /TD +/Type /StructElem +>> +endobj +2596 0 obj +<< +/K 1258 0 R +/P 392 0 R +/S /Strong +/Type /StructElem +>> +endobj +2597 0 obj +<< +/K 1261 0 R +/P 393 0 R +/S /Strong +/Type /StructElem +>> +endobj +2598 0 obj +<< +/K 1279 0 R +/P 394 0 R +/S /Strong +/Type /StructElem +>> +endobj +2599 0 obj +<< +/K 1287 0 R +/P 395 0 R +/S /Strong +/Type /StructElem +>> +endobj +2600 0 obj +<< +/K 1290 0 R +/P 396 0 R +/S /Strong +/Type /StructElem +>> +endobj +2601 0 obj +<< +/K 1293 0 R +/P 397 0 R +/S /Strong +/Type /StructElem +>> +endobj +2602 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1301 0 R +/P 401 0 R +/S /TD +/Type /StructElem +>> +endobj +2603 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1303 0 R +/P 401 0 R +/S /TD +/Type /StructElem +>> +endobj +2604 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [2906 0 R 1305 0 R] +/P 401 0 R +/S /TD +/Type /StructElem +>> +endobj +2605 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1306 0 R +/P 402 0 R +/S /TD +/Type /StructElem +>> +endobj +2606 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1308 0 R +/P 402 0 R +/S /TD +/Type /StructElem +>> +endobj +2607 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1309 0 R +/P 402 0 R +/S /TD +/Type /StructElem +>> +endobj +2608 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1311 0 R +/P 403 0 R +/S /TD +/Type /StructElem +>> +endobj +2609 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1313 0 R +/P 403 0 R +/S /TD +/Type /StructElem +>> +endobj +2610 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1314 0 R +/P 403 0 R +/S /TD +/Type /StructElem +>> +endobj +2611 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1316 0 R +/P 404 0 R +/S /TD +/Type /StructElem +>> +endobj +2612 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1318 0 R +/P 404 0 R +/S /TD +/Type /StructElem +>> +endobj +2613 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1319 0 R +/P 404 0 R +/S /TD +/Type /StructElem +>> +endobj +2614 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1321 0 R +/P 405 0 R +/S /TD +/Type /StructElem +>> +endobj +2615 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1323 0 R +/P 405 0 R +/S /TD +/Type /StructElem +>> +endobj +2616 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1324 0 R +/P 405 0 R +/S /TD +/Type /StructElem +>> +endobj +2617 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1326 0 R +/P 406 0 R +/S /TD +/Type /StructElem +>> +endobj +2618 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1328 0 R +/P 406 0 R +/S /TD +/Type /StructElem +>> +endobj +2619 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1329 0 R +/P 406 0 R +/S /TD +/Type /StructElem +>> +endobj +2620 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1331 0 R +/P 407 0 R +/S /TD +/Type /StructElem +>> +endobj +2621 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1333 0 R +/P 407 0 R +/S /TD +/Type /StructElem +>> +endobj +2622 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1334 0 R +/P 407 0 R +/S /TD +/Type /StructElem +>> +endobj +2623 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1336 0 R +/P 408 0 R +/S /TD +/Type /StructElem +>> +endobj +2624 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1338 0 R +/P 408 0 R +/S /TD +/Type /StructElem +>> +endobj +2625 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1339 0 R +/P 408 0 R +/S /TD +/Type /StructElem +>> +endobj +2626 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1340 0 R +/P 409 0 R +/S /TD +/Type /StructElem +>> +endobj +2627 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1342 0 R +/P 409 0 R +/S /TD +/Type /StructElem +>> +endobj +2628 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1343 0 R +/P 409 0 R +/S /TD +/Type /StructElem +>> +endobj +2629 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1344 0 R +/P 410 0 R +/S /TD +/Type /StructElem +>> +endobj +2630 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1346 0 R +/P 410 0 R +/S /TD +/Type /StructElem +>> +endobj +2631 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1347 0 R +/P 410 0 R +/S /TD +/Type /StructElem +>> +endobj +2632 0 obj +<< +/A [<< +/Headers [(node00002359)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1348 0 R +/P 411 0 R +/S /TD +/Type /StructElem +>> +endobj +2633 0 obj +<< +/A [<< +/Headers [(node00002360)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1350 0 R +/P 411 0 R +/S /TD +/Type /StructElem +>> +endobj +2634 0 obj +<< +/A [<< +/Headers [(node00002361)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1351 0 R +/P 411 0 R +/S /TD +/Type /StructElem +>> +endobj +2635 0 obj +<< +/K 1352 0 R +/P 412 0 R +/S /Strong +/Type /StructElem +>> +endobj +2636 0 obj +<< +/A [<< +/Headers [(node00002435)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1366 0 R +/P 415 0 R +/S /TD +/Type /StructElem +>> +endobj +2637 0 obj +<< +/A [<< +/Headers [(node00002436)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1367 0 R +/P 415 0 R +/S /TD +/Type /StructElem +>> +endobj +2638 0 obj +<< +/A [<< +/Headers [(node00002437)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [2907 0 R 1369 0 R] +/P 415 0 R +/S /TD +/Type /StructElem +>> +endobj +2639 0 obj +<< +/A [<< +/Headers [(node00002435)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1370 0 R +/P 416 0 R +/S /TD +/Type /StructElem +>> +endobj +2640 0 obj +<< +/A [<< +/Headers [(node00002436)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1371 0 R +/P 416 0 R +/S /TD +/Type /StructElem +>> +endobj +2641 0 obj +<< +/A [<< +/Headers [(node00002437)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [2908 0 R 1373 0 R] +/P 416 0 R +/S /TD +/Type /StructElem +>> +endobj +2642 0 obj +<< +/A [<< +/Headers [(node00002458)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1378 0 R 1380 0 R] +/P 422 0 R +/S /TD +/Type /StructElem +>> +endobj +2643 0 obj +<< +/A [<< +/Headers [(node00002459)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1381 0 R +/P 422 0 R +/S /TD +/Type /StructElem +>> +endobj +2644 0 obj +<< +/A [<< +/Headers [(node00002460)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2909 0 R +/P 422 0 R +/S /TD +/Type /StructElem +>> +endobj +2645 0 obj +<< +/A [<< +/Headers [(node00002458)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1383 0 R 1385 0 R] +/P 423 0 R +/S /TD +/Type /StructElem +>> +endobj +2646 0 obj +<< +/A [<< +/Headers [(node00002459)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1386 0 R +/P 423 0 R +/S /TD +/Type /StructElem +>> +endobj +2647 0 obj +<< +/A [<< +/Headers [(node00002460)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2910 0 R +/P 423 0 R +/S /TD +/Type /StructElem +>> +endobj +2648 0 obj +<< +/A [<< +/Headers [(node00002458)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1388 0 R +/P 424 0 R +/S /TD +/Type /StructElem +>> +endobj +2649 0 obj +<< +/A [<< +/Headers [(node00002459)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1390 0 R +/P 424 0 R +/S /TD +/Type /StructElem +>> +endobj +2650 0 obj +<< +/A [<< +/Headers [(node00002460)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2911 0 R +/P 424 0 R +/S /TD +/Type /StructElem +>> +endobj +2651 0 obj +<< +/A [<< +/Headers [(node00002458)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1392 0 R +/P 425 0 R +/S /TD +/Type /StructElem +>> +endobj +2652 0 obj +<< +/A [<< +/Headers [(node00002459)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1394 0 R +/P 425 0 R +/S /TD +/Type /StructElem +>> +endobj +2653 0 obj +<< +/A [<< +/Headers [(node00002460)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2912 0 R +/P 425 0 R +/S /TD +/Type /StructElem +>> +endobj +2654 0 obj +<< +/A [<< +/Headers [(node00002458)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1396 0 R +/P 426 0 R +/S /TD +/Type /StructElem +>> +endobj +2655 0 obj +<< +/A [<< +/Headers [(node00002459)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1398 0 R +/P 426 0 R +/S /TD +/Type /StructElem +>> +endobj +2656 0 obj +<< +/A [<< +/Headers [(node00002460)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2913 0 R +/P 426 0 R +/S /TD +/Type /StructElem +>> +endobj +2657 0 obj +<< +/A [<< +/Headers [(node00002458)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1400 0 R +/P 427 0 R +/S /TD +/Type /StructElem +>> +endobj +2658 0 obj +<< +/A [<< +/Headers [(node00002459)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1402 0 R +/P 427 0 R +/S /TD +/Type /StructElem +>> +endobj +2659 0 obj +<< +/A [<< +/Headers [(node00002460)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2914 0 R +/P 427 0 R +/S /TD +/Type /StructElem +>> +endobj +2660 0 obj +<< +/A [<< +/Headers [(node00002504)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1409 0 R +/P 433 0 R +/S /TD +/Type /StructElem +>> +endobj +2661 0 obj +<< +/A [<< +/Headers [(node00002505)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1410 0 R 1412 0 R] +/P 433 0 R +/S /TD +/Type /StructElem +>> +endobj +2662 0 obj +<< +/A [<< +/Headers [(node00002506)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1413 0 R +/P 433 0 R +/S /TD +/Type /StructElem +>> +endobj +2663 0 obj +<< +/A [<< +/Headers [(node00002507)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1415 0 R +/P 433 0 R +/S /TD +/Type /StructElem +>> +endobj +2664 0 obj +<< +/A [<< +/Headers [(node00002504)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1416 0 R +/P 434 0 R +/S /TD +/Type /StructElem +>> +endobj +2665 0 obj +<< +/A [<< +/Headers [(node00002505)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1417 0 R 1419 0 R] +/P 434 0 R +/S /TD +/Type /StructElem +>> +endobj +2666 0 obj +<< +/A [<< +/Headers [(node00002506)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1420 0 R +/P 434 0 R +/S /TD +/Type /StructElem +>> +endobj +2667 0 obj +<< +/A [<< +/Headers [(node00002507)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1422 0 R +/P 434 0 R +/S /TD +/Type /StructElem +>> +endobj +2668 0 obj +<< +/A [<< +/Headers [(node00002504)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1423 0 R +/P 435 0 R +/S /TD +/Type /StructElem +>> +endobj +2669 0 obj +<< +/A [<< +/Headers [(node00002505)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1424 0 R 1426 0 R] +/P 435 0 R +/S /TD +/Type /StructElem +>> +endobj +2670 0 obj +<< +/A [<< +/Headers [(node00002506)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1427 0 R +/P 435 0 R +/S /TD +/Type /StructElem +>> +endobj +2671 0 obj +<< +/A [<< +/Headers [(node00002507)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1429 0 R +/P 435 0 R +/S /TD +/Type /StructElem +>> +endobj +2672 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1446 0 R +/P 462 0 R +/S /TD +/Type /StructElem +>> +endobj +2673 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1448 0 R +/P 462 0 R +/S /TD +/Type /StructElem +>> +endobj +2674 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2915 0 R +/P 462 0 R +/S /TD +/Type /StructElem +>> +endobj +2675 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1450 0 R +/P 462 0 R +/S /TD +/Type /StructElem +>> +endobj +2676 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1451 0 R +/P 463 0 R +/S /TD +/Type /StructElem +>> +endobj +2677 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1453 0 R +/P 463 0 R +/S /TD +/Type /StructElem +>> +endobj +2678 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2916 0 R +/P 463 0 R +/S /TD +/Type /StructElem +>> +endobj +2679 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1455 0 R +/P 463 0 R +/S /TD +/Type /StructElem +>> +endobj +2680 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1456 0 R +/P 464 0 R +/S /TD +/Type /StructElem +>> +endobj +2681 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1458 0 R +/P 464 0 R +/S /TD +/Type /StructElem +>> +endobj +2682 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2917 0 R +/P 464 0 R +/S /TD +/Type /StructElem +>> +endobj +2683 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1460 0 R +/P 464 0 R +/S /TD +/Type /StructElem +>> +endobj +2684 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1461 0 R +/P 465 0 R +/S /TD +/Type /StructElem +>> +endobj +2685 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1463 0 R +/P 465 0 R +/S /TD +/Type /StructElem +>> +endobj +2686 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2918 0 R +/P 465 0 R +/S /TD +/Type /StructElem +>> +endobj +2687 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1465 0 R +/P 465 0 R +/S /TD +/Type /StructElem +>> +endobj +2688 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1466 0 R +/P 466 0 R +/S /TD +/Type /StructElem +>> +endobj +2689 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1468 0 R +/P 466 0 R +/S /TD +/Type /StructElem +>> +endobj +2690 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2919 0 R +/P 466 0 R +/S /TD +/Type /StructElem +>> +endobj +2691 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1470 0 R +/P 466 0 R +/S /TD +/Type /StructElem +>> +endobj +2692 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1471 0 R +/P 467 0 R +/S /TD +/Type /StructElem +>> +endobj +2693 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1473 0 R +/P 467 0 R +/S /TD +/Type /StructElem +>> +endobj +2694 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2920 0 R +/P 467 0 R +/S /TD +/Type /StructElem +>> +endobj +2695 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1475 0 R +/P 467 0 R +/S /TD +/Type /StructElem +>> +endobj +2696 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1476 0 R +/P 468 0 R +/S /TD +/Type /StructElem +>> +endobj +2697 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1478 0 R +/P 468 0 R +/S /TD +/Type /StructElem +>> +endobj +2698 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2921 0 R +/P 468 0 R +/S /TD +/Type /StructElem +>> +endobj +2699 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1480 0 R +/P 468 0 R +/S /TD +/Type /StructElem +>> +endobj +2700 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1481 0 R +/P 469 0 R +/S /TD +/Type /StructElem +>> +endobj +2701 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1483 0 R +/P 469 0 R +/S /TD +/Type /StructElem +>> +endobj +2702 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2922 0 R +/P 469 0 R +/S /TD +/Type /StructElem +>> +endobj +2703 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1485 0 R +/P 469 0 R +/S /TD +/Type /StructElem +>> +endobj +2704 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1487 0 R +/P 470 0 R +/S /TD +/Type /StructElem +>> +endobj +2705 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1489 0 R +/P 470 0 R +/S /TD +/Type /StructElem +>> +endobj +2706 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2923 0 R +/P 470 0 R +/S /TD +/Type /StructElem +>> +endobj +2707 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1491 0 R +/P 470 0 R +/S /TD +/Type /StructElem +>> +endobj +2708 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1492 0 R +/P 471 0 R +/S /TD +/Type /StructElem +>> +endobj +2709 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1494 0 R +/P 471 0 R +/S /TD +/Type /StructElem +>> +endobj +2710 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2924 0 R +/P 471 0 R +/S /TD +/Type /StructElem +>> +endobj +2711 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1496 0 R +/P 471 0 R +/S /TD +/Type /StructElem +>> +endobj +2712 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1497 0 R +/P 472 0 R +/S /TD +/Type /StructElem +>> +endobj +2713 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1499 0 R +/P 472 0 R +/S /TD +/Type /StructElem +>> +endobj +2714 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2925 0 R +/P 472 0 R +/S /TD +/Type /StructElem +>> +endobj +2715 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1501 0 R +/P 472 0 R +/S /TD +/Type /StructElem +>> +endobj +2716 0 obj +<< +/A [<< +/Headers [(node00002548)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1502 0 R +/P 473 0 R +/S /TD +/Type /StructElem +>> +endobj +2717 0 obj +<< +/A [<< +/Headers [(node00002549)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1504 0 R +/P 473 0 R +/S /TD +/Type /StructElem +>> +endobj +2718 0 obj +<< +/A [<< +/Headers [(node00002550)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2926 0 R +/P 473 0 R +/S /TD +/Type /StructElem +>> +endobj +2719 0 obj +<< +/A [<< +/Headers [(node00002551)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1506 0 R +/P 473 0 R +/S /TD +/Type /StructElem +>> +endobj +2720 0 obj +<< +/A [<< +/Headers [(node00002641)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1510 0 R +/P 476 0 R +/S /TD +/Type /StructElem +>> +endobj +2721 0 obj +<< +/A [<< +/Headers [(node00002642)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1511 0 R +/P 476 0 R +/S /TD +/Type /StructElem +>> +endobj +2722 0 obj +<< +/A [<< +/Headers [(node00002643)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2927 0 R +/P 476 0 R +/S /TD +/Type /StructElem +>> +endobj +2723 0 obj +<< +/A [<< +/Headers [(node00002641)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1513 0 R +/P 477 0 R +/S /TD +/Type /StructElem +>> +endobj +2724 0 obj +<< +/A [<< +/Headers [(node00002642)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1514 0 R +/P 477 0 R +/S /TD +/Type /StructElem +>> +endobj +2725 0 obj +<< +/A [<< +/Headers [(node00002643)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2928 0 R +/P 477 0 R +/S /TD +/Type /StructElem +>> +endobj +2726 0 obj +<< +/A [<< +/Headers [(node00002641)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1516 0 R +/P 478 0 R +/S /TD +/Type /StructElem +>> +endobj +2727 0 obj +<< +/A [<< +/Headers [(node00002642)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1517 0 R +/P 478 0 R +/S /TD +/Type /StructElem +>> +endobj +2728 0 obj +<< +/A [<< +/Headers [(node00002643)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2929 0 R +/P 478 0 R +/S /TD +/Type /StructElem +>> +endobj +2729 0 obj +<< +/A [<< +/Headers [(node00002641)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1519 0 R +/P 479 0 R +/S /TD +/Type /StructElem +>> +endobj +2730 0 obj +<< +/A [<< +/Headers [(node00002642)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1520 0 R +/P 479 0 R +/S /TD +/Type /StructElem +>> +endobj +2731 0 obj +<< +/A [<< +/Headers [(node00002643)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2930 0 R +/P 479 0 R +/S /TD +/Type /StructElem +>> +endobj +2732 0 obj +<< +/A [<< +/Headers [(node00002673)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1527 0 R +/P 486 0 R +/S /TD +/Type /StructElem +>> +endobj +2733 0 obj +<< +/A [<< +/Headers [(node00002674)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1528 0 R 1530 0 R] +/P 486 0 R +/S /TD +/Type /StructElem +>> +endobj +2734 0 obj +<< +/A [<< +/Headers [(node00002675)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [2931 0 R 1532 0 R] +/P 486 0 R +/S /TD +/Type /StructElem +>> +endobj +2735 0 obj +<< +/A [<< +/Headers [(node00002673)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1533 0 R +/P 487 0 R +/S /TD +/Type /StructElem +>> +endobj +2736 0 obj +<< +/A [<< +/Headers [(node00002674)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1534 0 R 1536 0 R] +/P 487 0 R +/S /TD +/Type /StructElem +>> +endobj +2737 0 obj +<< +/A [<< +/Headers [(node00002675)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [2932 0 R 1538 0 R] +/P 487 0 R +/S /TD +/Type /StructElem +>> +endobj +2738 0 obj +<< +/A [<< +/Headers [(node00002673)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1539 0 R +/P 488 0 R +/S /TD +/Type /StructElem +>> +endobj +2739 0 obj +<< +/A [<< +/Headers [(node00002674)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1540 0 R +/P 488 0 R +/S /TD +/Type /StructElem +>> +endobj +2740 0 obj +<< +/A [<< +/Headers [(node00002675)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2933 0 R +/P 488 0 R +/S /TD +/Type /StructElem +>> +endobj +2741 0 obj +<< +/A [<< +/Headers [(node00002673)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1542 0 R +/P 489 0 R +/S /TD +/Type /StructElem +>> +endobj +2742 0 obj +<< +/A [<< +/Headers [(node00002674)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1543 0 R +/P 489 0 R +/S /TD +/Type /StructElem +>> +endobj +2743 0 obj +<< +/A [<< +/Headers [(node00002675)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2934 0 R +/P 489 0 R +/S /TD +/Type /StructElem +>> +endobj +2744 0 obj +<< +/A [<< +/Headers [(node00002673)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1545 0 R +/P 490 0 R +/S /TD +/Type /StructElem +>> +endobj +2745 0 obj +<< +/A [<< +/Headers [(node00002674)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1546 0 R +/P 490 0 R +/S /TD +/Type /StructElem +>> +endobj +2746 0 obj +<< +/A [<< +/Headers [(node00002675)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [2935 0 R 1548 0 R] +/P 490 0 R +/S /TD +/Type /StructElem +>> +endobj +2747 0 obj +<< +/K 1778 0 R +/P 565 0 R +/S /Strong +/Type /StructElem +>> +endobj +2748 0 obj +<< +/A [<< +/Headers [(node00003027)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1811 0 R +/P 637 0 R +/S /TD +/Type /StructElem +>> +endobj +2749 0 obj +<< +/A [<< +/Headers [(node00003028)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1812 0 R +/P 637 0 R +/S /TD +/Type /StructElem +>> +endobj +2750 0 obj +<< +/A [<< +/Headers [(node00003029)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1813 0 R +/P 637 0 R +/S /TD +/Type /StructElem +>> +endobj +2751 0 obj +<< +/A [<< +/Headers [(node00003027)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1814 0 R +/P 638 0 R +/S /TD +/Type /StructElem +>> +endobj +2752 0 obj +<< +/A [<< +/Headers [(node00003028)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1815 0 R +/P 638 0 R +/S /TD +/Type /StructElem +>> +endobj +2753 0 obj +<< +/A [<< +/Headers [(node00003029)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1816 0 R +/P 638 0 R +/S /TD +/Type /StructElem +>> +endobj +2754 0 obj +<< +/A [<< +/Headers [(node00003027)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1817 0 R +/P 639 0 R +/S /TD +/Type /StructElem +>> +endobj +2755 0 obj +<< +/A [<< +/Headers [(node00003028)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1818 0 R +/P 639 0 R +/S /TD +/Type /StructElem +>> +endobj +2756 0 obj +<< +/A [<< +/Headers [(node00003029)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1819 0 R +/P 639 0 R +/S /TD +/Type /StructElem +>> +endobj +2757 0 obj +<< +/A [<< +/Headers [(node00003027)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1820 0 R +/P 640 0 R +/S /TD +/Type /StructElem +>> +endobj +2758 0 obj +<< +/A [<< +/Headers [(node00003028)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1821 0 R +/P 640 0 R +/S /TD +/Type /StructElem +>> +endobj +2759 0 obj +<< +/A [<< +/Headers [(node00003029)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1822 0 R +/P 640 0 R +/S /TD +/Type /StructElem +>> +endobj +2760 0 obj +<< +/A [<< +/Headers [(node00003027)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1823 0 R +/P 641 0 R +/S /TD +/Type /StructElem +>> +endobj +2761 0 obj +<< +/A [<< +/Headers [(node00003028)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1824 0 R +/P 641 0 R +/S /TD +/Type /StructElem +>> +endobj +2762 0 obj +<< +/A [<< +/Headers [(node00003029)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1825 0 R +/P 641 0 R +/S /TD +/Type /StructElem +>> +endobj +2763 0 obj +<< +/A [<< +/Headers [(node00003171)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1914 0 R 1916 0 R] +/P 700 0 R +/S /TD +/Type /StructElem +>> +endobj +2764 0 obj +<< +/A [<< +/Headers [(node00003172)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1917 0 R +/P 700 0 R +/S /TD +/Type /StructElem +>> +endobj +2765 0 obj +<< +/A [<< +/Headers [(node00003173)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1918 0 R +/P 700 0 R +/S /TD +/Type /StructElem +>> +endobj +2766 0 obj +<< +/A [<< +/Headers [(node00003174)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1919 0 R +/P 700 0 R +/S /TD +/Type /StructElem +>> +endobj +2767 0 obj +<< +/A [<< +/Headers [(node00003171)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1920 0 R +/P 701 0 R +/S /TD +/Type /StructElem +>> +endobj +2768 0 obj +<< +/A [<< +/Headers [(node00003172)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1922 0 R +/P 701 0 R +/S /TD +/Type /StructElem +>> +endobj +2769 0 obj +<< +/A [<< +/Headers [(node00003173)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1923 0 R +/P 701 0 R +/S /TD +/Type /StructElem +>> +endobj +2770 0 obj +<< +/A [<< +/Headers [(node00003174)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1924 0 R +/P 701 0 R +/S /TD +/Type /StructElem +>> +endobj +2771 0 obj +<< +/A [<< +/Headers [(node00003171)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1925 0 R +/P 702 0 R +/S /TD +/Type /StructElem +>> +endobj +2772 0 obj +<< +/A [<< +/Headers [(node00003172)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1926 0 R +/P 702 0 R +/S /TD +/Type /StructElem +>> +endobj +2773 0 obj +<< +/A [<< +/Headers [(node00003173)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1927 0 R +/P 702 0 R +/S /TD +/Type /StructElem +>> +endobj +2774 0 obj +<< +/A [<< +/Headers [(node00003174)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1928 0 R +/P 702 0 R +/S /TD +/Type /StructElem +>> +endobj +2775 0 obj +<< +/A [<< +/Headers [(node00003171)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K [1929 0 R 1931 0 R] +/P 703 0 R +/S /TD +/Type /StructElem +>> +endobj +2776 0 obj +<< +/A [<< +/Headers [(node00003172)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1932 0 R +/P 703 0 R +/S /TD +/Type /StructElem +>> +endobj +2777 0 obj +<< +/A [<< +/Headers [(node00003173)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1933 0 R +/P 703 0 R +/S /TD +/Type /StructElem +>> +endobj +2778 0 obj +<< +/A [<< +/Headers [(node00003174)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 1934 0 R +/P 703 0 R +/S /TD +/Type /StructElem +>> +endobj +2779 0 obj +<< +/A [<< +/Headers [(node00003385)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2095 0 R +/P 746 0 R +/S /TD +/Type /StructElem +>> +endobj +2780 0 obj +<< +/A [<< +/Headers [(node00003386)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2096 0 R +/P 746 0 R +/S /TD +/Type /StructElem +>> +endobj +2781 0 obj +<< +/A [<< +/Headers [(node00003387)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2097 0 R +/P 746 0 R +/S /TD +/Type /StructElem +>> +endobj +2782 0 obj +<< +/A [<< +/Headers [(node00003385)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2098 0 R +/P 747 0 R +/S /TD +/Type /StructElem +>> +endobj +2783 0 obj +<< +/A [<< +/Headers [(node00003386)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2099 0 R +/P 747 0 R +/S /TD +/Type /StructElem +>> +endobj +2784 0 obj +<< +/A [<< +/Headers [(node00003387)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2100 0 R +/P 747 0 R +/S /TD +/Type /StructElem +>> +endobj +2785 0 obj +<< +/A [<< +/Headers [(node00003385)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2101 0 R +/P 748 0 R +/S /TD +/Type /StructElem +>> +endobj +2786 0 obj +<< +/A [<< +/Headers [(node00003386)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2102 0 R +/P 748 0 R +/S /TD +/Type /StructElem +>> +endobj +2787 0 obj +<< +/A [<< +/Headers [(node00003387)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2103 0 R +/P 748 0 R +/S /TD +/Type /StructElem +>> +endobj +2788 0 obj +<< +/A [<< +/Headers [(node00003385)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2104 0 R +/P 749 0 R +/S /TD +/Type /StructElem +>> +endobj +2789 0 obj +<< +/A [<< +/Headers [(node00003386)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2105 0 R +/P 749 0 R +/S /TD +/Type /StructElem +>> +endobj +2790 0 obj +<< +/A [<< +/Headers [(node00003387)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2106 0 R +/P 749 0 R +/S /TD +/Type /StructElem +>> +endobj +2791 0 obj +<< +/A [<< +/Headers [(node00003385)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2107 0 R +/P 750 0 R +/S /TD +/Type /StructElem +>> +endobj +2792 0 obj +<< +/A [<< +/Headers [(node00003386)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2108 0 R +/P 750 0 R +/S /TD +/Type /StructElem +>> +endobj +2793 0 obj +<< +/A [<< +/Headers [(node00003387)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2109 0 R +/P 750 0 R +/S /TD +/Type /StructElem +>> +endobj +2794 0 obj +<< +/A [<< +/Headers [(node00003385)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2110 0 R +/P 751 0 R +/S /TD +/Type /StructElem +>> +endobj +2795 0 obj +<< +/A [<< +/Headers [(node00003386)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2111 0 R +/P 751 0 R +/S /TD +/Type /StructElem +>> +endobj +2796 0 obj +<< +/A [<< +/Headers [(node00003387)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2112 0 R +/P 751 0 R +/S /TD +/Type /StructElem +>> +endobj +2797 0 obj +<< +/A [<< +/Headers [(node00003385)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2113 0 R +/P 752 0 R +/S /TD +/Type /StructElem +>> +endobj +2798 0 obj +<< +/A [<< +/Headers [(node00003386)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2114 0 R +/P 752 0 R +/S /TD +/Type /StructElem +>> +endobj +2799 0 obj +<< +/A [<< +/Headers [(node00003387)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2115 0 R +/P 752 0 R +/S /TD +/Type /StructElem +>> +endobj +2800 0 obj +<< +/A [<< +/Headers [(node00003385)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2116 0 R +/P 753 0 R +/S /TD +/Type /StructElem +>> +endobj +2801 0 obj +<< +/A [<< +/Headers [(node00003386)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2117 0 R +/P 753 0 R +/S /TD +/Type /StructElem +>> +endobj +2802 0 obj +<< +/A [<< +/Headers [(node00003387)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2118 0 R +/P 753 0 R +/S /TD +/Type /StructElem +>> +endobj +2803 0 obj +<< +/A [<< +/Headers [(node00003385)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2936 0 R +/P 754 0 R +/S /TD +/Type /StructElem +>> +endobj +2804 0 obj +<< +/A [<< +/Headers [(node00003386)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2937 0 R +/P 754 0 R +/S /TD +/Type /StructElem +>> +endobj +2805 0 obj +<< +/A [<< +/Headers [(node00003387)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2121 0 R +/P 754 0 R +/S /TD +/Type /StructElem +>> +endobj +2806 0 obj +<< +/A [<< +/Headers [(node00003465)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2163 0 R +/P 789 0 R +/S /TD +/Type /StructElem +>> +endobj +2807 0 obj +<< +/A [<< +/Headers [(node00003466)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2164 0 R +/P 789 0 R +/S /TD +/Type /StructElem +>> +endobj +2808 0 obj +<< +/A [<< +/Headers [(node00003467)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2165 0 R +/P 789 0 R +/S /TD +/Type /StructElem +>> +endobj +2809 0 obj +<< +/A [<< +/Headers [(node00003465)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2166 0 R +/P 790 0 R +/S /TD +/Type /StructElem +>> +endobj +2810 0 obj +<< +/A [<< +/Headers [(node00003466)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2167 0 R +/P 790 0 R +/S /TD +/Type /StructElem +>> +endobj +2811 0 obj +<< +/A [<< +/Headers [(node00003467)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2168 0 R +/P 790 0 R +/S /TD +/Type /StructElem +>> +endobj +2812 0 obj +<< +/A [<< +/Headers [(node00003465)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2169 0 R +/P 791 0 R +/S /TD +/Type /StructElem +>> +endobj +2813 0 obj +<< +/A [<< +/Headers [(node00003466)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2170 0 R +/P 791 0 R +/S /TD +/Type /StructElem +>> +endobj +2814 0 obj +<< +/A [<< +/Headers [(node00003467)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2171 0 R +/P 791 0 R +/S /TD +/Type /StructElem +>> +endobj +2815 0 obj +<< +/A [<< +/Headers [(node00003465)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2172 0 R +/P 792 0 R +/S /TD +/Type /StructElem +>> +endobj +2816 0 obj +<< +/A [<< +/Headers [(node00003466)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2173 0 R +/P 792 0 R +/S /TD +/Type /StructElem +>> +endobj +2817 0 obj +<< +/A [<< +/Headers [(node00003467)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2174 0 R +/P 792 0 R +/S /TD +/Type /StructElem +>> +endobj +2818 0 obj +<< +/A [<< +/Headers [(node00003491)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2179 0 R +/P 796 0 R +/S /TD +/Type /StructElem +>> +endobj +2819 0 obj +<< +/A [<< +/Headers [(node00003492)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2180 0 R +/P 796 0 R +/S /TD +/Type /StructElem +>> +endobj +2820 0 obj +<< +/A [<< +/Headers [(node00003493)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2938 0 R +/P 796 0 R +/S /TD +/Type /StructElem +>> +endobj +2821 0 obj +<< +/A [<< +/Headers [(node00003494)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2182 0 R +/P 796 0 R +/S /TD +/Type /StructElem +>> +endobj +2822 0 obj +<< +/A [<< +/Headers [(node00003491)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2183 0 R +/P 797 0 R +/S /TD +/Type /StructElem +>> +endobj +2823 0 obj +<< +/A [<< +/Headers [(node00003492)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2184 0 R +/P 797 0 R +/S /TD +/Type /StructElem +>> +endobj +2824 0 obj +<< +/A [<< +/Headers [(node00003493)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2185 0 R +/P 797 0 R +/S /TD +/Type /StructElem +>> +endobj +2825 0 obj +<< +/A [<< +/Headers [(node00003494)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2186 0 R +/P 797 0 R +/S /TD +/Type /StructElem +>> +endobj +2826 0 obj +<< +/A [<< +/Headers [(node00003491)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2187 0 R +/P 798 0 R +/S /TD +/Type /StructElem +>> +endobj +2827 0 obj +<< +/A [<< +/Headers [(node00003492)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2188 0 R +/P 798 0 R +/S /TD +/Type /StructElem +>> +endobj +2828 0 obj +<< +/A [<< +/Headers [(node00003493)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2189 0 R +/P 798 0 R +/S /TD +/Type /StructElem +>> +endobj +2829 0 obj +<< +/A [<< +/Headers [(node00003494)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2190 0 R +/P 798 0 R +/S /TD +/Type /StructElem +>> +endobj +2830 0 obj +<< +/A [<< +/Headers [(node00003491)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2191 0 R +/P 799 0 R +/S /TD +/Type /StructElem +>> +endobj +2831 0 obj +<< +/A [<< +/Headers [(node00003492)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2192 0 R +/P 799 0 R +/S /TD +/Type /StructElem +>> +endobj +2832 0 obj +<< +/A [<< +/Headers [(node00003493)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2193 0 R +/P 799 0 R +/S /TD +/Type /StructElem +>> +endobj +2833 0 obj +<< +/A [<< +/Headers [(node00003494)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2194 0 R +/P 799 0 R +/S /TD +/Type /StructElem +>> +endobj +2834 0 obj +<< +/A [<< +/Headers [(node00003521)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2198 0 R +/P 802 0 R +/S /TD +/Type /StructElem +>> +endobj +2835 0 obj +<< +/A [<< +/Headers [(node00003522)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2199 0 R +/P 802 0 R +/S /TD +/Type /StructElem +>> +endobj +2836 0 obj +<< +/A [<< +/Headers [(node00003523)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2200 0 R +/P 802 0 R +/S /TD +/Type /StructElem +>> +endobj +2837 0 obj +<< +/A [<< +/Headers [(node00003521)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2201 0 R +/P 803 0 R +/S /TD +/Type /StructElem +>> +endobj +2838 0 obj +<< +/A [<< +/Headers [(node00003522)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2202 0 R +/P 803 0 R +/S /TD +/Type /StructElem +>> +endobj +2839 0 obj +<< +/A [<< +/Headers [(node00003523)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2203 0 R +/P 803 0 R +/S /TD +/Type /StructElem +>> +endobj +2840 0 obj +<< +/A [<< +/Headers [(node00003521)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2204 0 R +/P 804 0 R +/S /TD +/Type /StructElem +>> +endobj +2841 0 obj +<< +/A [<< +/Headers [(node00003522)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2205 0 R +/P 804 0 R +/S /TD +/Type /StructElem +>> +endobj +2842 0 obj +<< +/A [<< +/Headers [(node00003523)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2206 0 R +/P 804 0 R +/S /TD +/Type /StructElem +>> +endobj +2843 0 obj +<< +/A [<< +/Headers [(node00003521)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2207 0 R +/P 805 0 R +/S /TD +/Type /StructElem +>> +endobj +2844 0 obj +<< +/A [<< +/Headers [(node00003522)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2208 0 R +/P 805 0 R +/S /TD +/Type /StructElem +>> +endobj +2845 0 obj +<< +/A [<< +/Headers [(node00003523)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2209 0 R +/P 805 0 R +/S /TD +/Type /StructElem +>> +endobj +2846 0 obj +<< +/A [<< +/Headers [(node00003521)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2210 0 R +/P 806 0 R +/S /TD +/Type /StructElem +>> +endobj +2847 0 obj +<< +/A [<< +/Headers [(node00003522)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2211 0 R +/P 806 0 R +/S /TD +/Type /StructElem +>> +endobj +2848 0 obj +<< +/A [<< +/Headers [(node00003523)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2212 0 R +/P 806 0 R +/S /TD +/Type /StructElem +>> +endobj +2849 0 obj +<< +/A [<< +/Headers [(node00003521)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2213 0 R +/P 807 0 R +/S /TD +/Type /StructElem +>> +endobj +2850 0 obj +<< +/A [<< +/Headers [(node00003522)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2214 0 R +/P 807 0 R +/S /TD +/Type /StructElem +>> +endobj +2851 0 obj +<< +/A [<< +/Headers [(node00003523)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2215 0 R +/P 807 0 R +/S /TD +/Type /StructElem +>> +endobj +2852 0 obj +<< +/A [<< +/Headers [(node00003521)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2216 0 R +/P 808 0 R +/S /TD +/Type /StructElem +>> +endobj +2853 0 obj +<< +/A [<< +/Headers [(node00003522)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2217 0 R +/P 808 0 R +/S /TD +/Type /StructElem +>> +endobj +2854 0 obj +<< +/A [<< +/Headers [(node00003523)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2218 0 R +/P 808 0 R +/S /TD +/Type /StructElem +>> +endobj +2855 0 obj +<< +/A [<< +/Headers [(node00003557)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2222 0 R +/P 811 0 R +/S /TD +/Type /StructElem +>> +endobj +2856 0 obj +<< +/A [<< +/Headers [(node00003558)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2223 0 R +/P 811 0 R +/S /TD +/Type /StructElem +>> +endobj +2857 0 obj +<< +/A [<< +/Headers [(node00003559)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2224 0 R +/P 811 0 R +/S /TD +/Type /StructElem +>> +endobj +2858 0 obj +<< +/A [<< +/Headers [(node00003557)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2225 0 R +/P 812 0 R +/S /TD +/Type /StructElem +>> +endobj +2859 0 obj +<< +/A [<< +/Headers [(node00003558)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2226 0 R +/P 812 0 R +/S /TD +/Type /StructElem +>> +endobj +2860 0 obj +<< +/A [<< +/Headers [(node00003559)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2227 0 R +/P 812 0 R +/S /TD +/Type /StructElem +>> +endobj +2861 0 obj +<< +/A [<< +/Headers [(node00003557)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2228 0 R +/P 813 0 R +/S /TD +/Type /StructElem +>> +endobj +2862 0 obj +<< +/A [<< +/Headers [(node00003558)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2229 0 R +/P 813 0 R +/S /TD +/Type /StructElem +>> +endobj +2863 0 obj +<< +/A [<< +/Headers [(node00003559)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2230 0 R +/P 813 0 R +/S /TD +/Type /StructElem +>> +endobj +2864 0 obj +<< +/A [<< +/Headers [(node00003557)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2231 0 R +/P 814 0 R +/S /TD +/Type /StructElem +>> +endobj +2865 0 obj +<< +/A [<< +/Headers [(node00003558)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2232 0 R +/P 814 0 R +/S /TD +/Type /StructElem +>> +endobj +2866 0 obj +<< +/A [<< +/Headers [(node00003559)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2233 0 R +/P 814 0 R +/S /TD +/Type /StructElem +>> +endobj +2867 0 obj +<< +/A [<< +/Headers [(node00003557)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2234 0 R +/P 815 0 R +/S /TD +/Type /StructElem +>> +endobj +2868 0 obj +<< +/A [<< +/Headers [(node00003558)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2235 0 R +/P 815 0 R +/S /TD +/Type /StructElem +>> +endobj +2869 0 obj +<< +/A [<< +/Headers [(node00003559)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2236 0 R +/P 815 0 R +/S /TD +/Type /StructElem +>> +endobj +2870 0 obj +<< +/A [<< +/Headers [(node00003557)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2237 0 R +/P 816 0 R +/S /TD +/Type /StructElem +>> +endobj +2871 0 obj +<< +/A [<< +/Headers [(node00003558)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2238 0 R +/P 816 0 R +/S /TD +/Type /StructElem +>> +endobj +2872 0 obj +<< +/A [<< +/Headers [(node00003559)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2239 0 R +/P 816 0 R +/S /TD +/Type /StructElem +>> +endobj +2873 0 obj +<< +/A [<< +/Headers [(node00003589)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2242 0 R +/P 819 0 R +/S /TD +/Type /StructElem +>> +endobj +2874 0 obj +<< +/A [<< +/Headers [(node00003590)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2243 0 R +/P 819 0 R +/S /TD +/Type /StructElem +>> +endobj +2875 0 obj +<< +/A [<< +/Headers [(node00003589)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2244 0 R +/P 820 0 R +/S /TD +/Type /StructElem +>> +endobj +2876 0 obj +<< +/A [<< +/Headers [(node00003590)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2245 0 R +/P 820 0 R +/S /TD +/Type /StructElem +>> +endobj +2877 0 obj +<< +/A [<< +/Headers [(node00003589)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2246 0 R +/P 821 0 R +/S /TD +/Type /StructElem +>> +endobj +2878 0 obj +<< +/A [<< +/Headers [(node00003590)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2247 0 R +/P 821 0 R +/S /TD +/Type /StructElem +>> +endobj +2879 0 obj +<< +/A [<< +/Headers [(node00003589)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2248 0 R +/P 822 0 R +/S /TD +/Type /StructElem +>> +endobj +2880 0 obj +<< +/A [<< +/Headers [(node00003590)] +/O /Table +>> << +/O /Table +/RowSpan 1 +>> << +/ColSpan 1 +/O /Table +>>] +/K 2249 0 R +/P 822 0 R +/S /TD +/Type /StructElem +>> +endobj +2881 0 obj +<< +/K 876 0 R +/P 2497 0 R +/S /Strong +/Type /StructElem +>> +endobj +2882 0 obj +<< +/K 882 0 R +/P 2502 0 R +/S /Strong +/Type /StructElem +>> +endobj +2883 0 obj +<< +/K 888 0 R +/P 2507 0 R +/S /Strong +/Type /StructElem +>> +endobj +2884 0 obj +<< +/K 894 0 R +/P 2512 0 R +/S /Strong +/Type /StructElem +>> +endobj +2885 0 obj +<< +/K 900 0 R +/P 2517 0 R +/S /Strong +/Type /StructElem +>> +endobj +2886 0 obj +<< +/K 906 0 R +/P 2522 0 R +/S /Strong +/Type /StructElem +>> +endobj +2887 0 obj +<< +/K 915 0 R +/P 2526 0 R +/S /Strong +/Type /StructElem +>> +endobj +2888 0 obj +<< +/K 920 0 R +/P 2530 0 R +/S /Strong +/Type /StructElem +>> +endobj +2889 0 obj +<< +/K 925 0 R +/P 2534 0 R +/S /Strong +/Type /StructElem +>> +endobj +2890 0 obj +<< +/K 930 0 R +/P 2538 0 R +/S /Strong +/Type /StructElem +>> +endobj +2891 0 obj +<< +/K 935 0 R +/P 2542 0 R +/S /Strong +/Type /StructElem +>> +endobj +2892 0 obj +<< +/K 940 0 R +/P 2546 0 R +/S /Strong +/Type /StructElem +>> +endobj +2893 0 obj +<< +/K 945 0 R +/P 2550 0 R +/S /Strong +/Type /StructElem +>> +endobj +2894 0 obj +<< +/K 950 0 R +/P 2554 0 R +/S /Strong +/Type /StructElem +>> +endobj +2895 0 obj +<< +/K 955 0 R +/P 2558 0 R +/S /Strong +/Type /StructElem +>> +endobj +2896 0 obj +<< +/K 960 0 R +/P 2562 0 R +/S /Strong +/Type /StructElem +>> +endobj +2897 0 obj +<< +/K 1207 0 R +/P 2566 0 R +/S /Strong +/Type /StructElem +>> +endobj +2898 0 obj +<< +/K 1209 0 R +/P 2567 0 R +/S /Strong +/Type /StructElem +>> +endobj +2899 0 obj +<< +/K 1217 0 R +/P 2571 0 R +/S /Strong +/Type /StructElem +>> +endobj +2900 0 obj +<< +/K 1222 0 R +/P 2575 0 R +/S /Strong +/Type /StructElem +>> +endobj +2901 0 obj +<< +/K 1227 0 R +/P 2579 0 R +/S /Strong +/Type /StructElem +>> +endobj +2902 0 obj +<< +/K 1232 0 R +/P 2583 0 R +/S /Strong +/Type /StructElem +>> +endobj +2903 0 obj +<< +/K 1240 0 R +/P 2587 0 R +/S /Strong +/Type /StructElem +>> +endobj +2904 0 obj +<< +/K 1248 0 R +/P 2591 0 R +/S /Strong +/Type /StructElem +>> +endobj +2905 0 obj +<< +/K 1256 0 R +/P 2595 0 R +/S /Strong +/Type /StructElem +>> +endobj +2906 0 obj +<< +/K 1304 0 R +/P 2604 0 R +/S /Strong +/Type /StructElem +>> +endobj +2907 0 obj +<< +/K 1368 0 R +/P 2638 0 R +/S /Strong +/Type /StructElem +>> +endobj +2908 0 obj +<< +/K 1372 0 R +/P 2641 0 R +/S /Strong +/Type /StructElem +>> +endobj +2909 0 obj +<< +/K 1382 0 R +/P 2644 0 R +/S /Strong +/Type /StructElem +>> +endobj +2910 0 obj +<< +/K 1387 0 R +/P 2647 0 R +/S /Strong +/Type /StructElem +>> +endobj +2911 0 obj +<< +/K 1391 0 R +/P 2650 0 R +/S /Strong +/Type /StructElem +>> +endobj +2912 0 obj +<< +/K 1395 0 R +/P 2653 0 R +/S /Strong +/Type /StructElem +>> +endobj +2913 0 obj +<< +/K 1399 0 R +/P 2656 0 R +/S /Strong +/Type /StructElem +>> +endobj +2914 0 obj +<< +/K 1403 0 R +/P 2659 0 R +/S /Strong +/Type /StructElem +>> +endobj +2915 0 obj +<< +/K 1449 0 R +/P 2674 0 R +/S /Strong +/Type /StructElem +>> +endobj +2916 0 obj +<< +/K 1454 0 R +/P 2678 0 R +/S /Strong +/Type /StructElem +>> +endobj +2917 0 obj +<< +/K 1459 0 R +/P 2682 0 R +/S /Strong +/Type /StructElem +>> +endobj +2918 0 obj +<< +/K 1464 0 R +/P 2686 0 R +/S /Strong +/Type /StructElem +>> +endobj +2919 0 obj +<< +/K 1469 0 R +/P 2690 0 R +/S /Strong +/Type /StructElem +>> +endobj +2920 0 obj +<< +/K 1474 0 R +/P 2694 0 R +/S /Strong +/Type /StructElem +>> +endobj +2921 0 obj +<< +/K 1479 0 R +/P 2698 0 R +/S /Strong +/Type /StructElem +>> +endobj +2922 0 obj +<< +/K 1484 0 R +/P 2702 0 R +/S /Strong +/Type /StructElem +>> +endobj +2923 0 obj +<< +/K 1490 0 R +/P 2706 0 R +/S /Strong +/Type /StructElem +>> +endobj +2924 0 obj +<< +/K 1495 0 R +/P 2710 0 R +/S /Strong +/Type /StructElem +>> +endobj +2925 0 obj +<< +/K 1500 0 R +/P 2714 0 R +/S /Strong +/Type /StructElem +>> +endobj +2926 0 obj +<< +/K 1505 0 R +/P 2718 0 R +/S /Strong +/Type /StructElem +>> +endobj +2927 0 obj +<< +/K 1512 0 R +/P 2722 0 R +/S /Strong +/Type /StructElem +>> +endobj +2928 0 obj +<< +/K 1515 0 R +/P 2725 0 R +/S /Strong +/Type /StructElem +>> +endobj +2929 0 obj +<< +/K 1518 0 R +/P 2728 0 R +/S /Strong +/Type /StructElem +>> +endobj +2930 0 obj +<< +/K 1521 0 R +/P 2731 0 R +/S /Strong +/Type /StructElem +>> +endobj +2931 0 obj +<< +/K 1531 0 R +/P 2734 0 R +/S /Strong +/Type /StructElem +>> +endobj +2932 0 obj +<< +/K 1537 0 R +/P 2737 0 R +/S /Strong +/Type /StructElem +>> +endobj +2933 0 obj +<< +/K 1541 0 R +/P 2740 0 R +/S /Strong +/Type /StructElem +>> +endobj +2934 0 obj +<< +/K 1544 0 R +/P 2743 0 R +/S /Strong +/Type /StructElem +>> +endobj +2935 0 obj +<< +/K 1547 0 R +/P 2746 0 R +/S /Strong +/Type /StructElem +>> +endobj +2936 0 obj +<< +/K 2119 0 R +/P 2803 0 R +/S /Strong +/Type /StructElem +>> +endobj +2937 0 obj +<< +/K 2120 0 R +/P 2804 0 R +/S /Strong +/Type /StructElem +>> +endobj +2938 0 obj +<< +/K 2181 0 R +/P 2820 0 R +/S /Strong +/Type /StructElem +>> +endobj +2939 0 obj +<< +/BM /Multiply +/Type /ExtGState +>> +endobj +2940 0 obj +<< +/BBox [51.933987 682.937256 147.702927 692.912842] +/Filter /FlateDecode +/Length 96 +/Resources << +>> +/Subtype /Form +/Type /XObject +>> +stream +xڅ9 +@}EќyςJ@NVчec#KYb8B@F8Yot*v,6OZiǛn> +endobj +2942 0 obj +<< +/BBox [147.848251 682.937256 215.557983 692.912842] +/Filter /FlateDecode +/Length 98 +/Resources << +>> +/Subtype /Form +/Type /XObject +>> +stream +xڅ;B1'O6y"4ܿyچr,m"ȉcXD) ahҍ6w,9`;y jl' +endstream +endobj +2943 0 obj +<< +/Ascent 1088.37891 +/CapHeight 717.77344 +/Descent 241.69922 +/Flags 4 +/FontBBox [-1014.16016 -245.60547 1236.81641 956.05469] +/FontFile2 2971 0 R +/FontName /AAAAAA+MalgunGothicBold +/ItalicAngle 0 +/StemV 76.171875 +/Type /FontDescriptor +>> +endobj +2944 0 obj +<< +/Ascent 1088.37891 +/CapHeight 718.26172 +/Descent 241.69922 +/Flags 4 +/FontBBox [-976.5625 -248.04688 1198.73047 931.15234] +/FontFile2 2972 0 R +/FontName /BAAAAA+MalgunGothic +/ItalicAngle 0 +/StemV 45.898438 +/Type /FontDescriptor +>> +endobj +2945 0 obj +<< +/Matrix [2048 0 0 2048 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.68652344 -0.72607422 0.68652344 0.140136719] +/Extend [true true] +/Function << +/C0 [1 0.8431 0.3451] +/C1 [1 0.6627 0.3373] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2946 0 obj +<< +/BBox [22 30 2061 1804] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2921 2973 0 R +>> +/Pattern << +/P2918 2974 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2041 +/YStep 1776 +>> +stream +/G2921 gs +/Pattern CS/Pattern cs/P2918 SCN/P2918 scn +22 30 2039 1774 re +f* + +endstream +endobj +2947 0 obj +<< +/BBox [22 30 2061 1804] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2926 2975 0 R +>> +/Pattern << +/P2923 2976 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2041 +/YStep 1776 +>> +stream +/G2926 gs +/Pattern CS/Pattern cs/P2923 SCN/P2923 scn +22 30 2039 1774 re +f* + +endstream +endobj +2948 0 obj +<< +/BBox [22 30 2061 1804] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2931 2977 0 R +>> +/Pattern << +/P2928 2978 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2041 +/YStep 1776 +>> +stream +/G2931 gs +/Pattern CS/Pattern cs/P2928 SCN/P2928 scn +22 30 2039 1774 re +f* + +endstream +endobj +2949 0 obj +<< +/BBox [22 30 2061 1804] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2936 2979 0 R +>> +/Pattern << +/P2933 2980 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2041 +/YStep 1776 +>> +stream +/G2936 gs +/Pattern CS/Pattern cs/P2933 SCN/P2933 scn +22 30 2039 1774 re +f* + +endstream +endobj +2950 0 obj +<< +/BBox [22 30 2061 1804] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2941 2981 0 R +>> +/Pattern << +/P2938 2982 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2041 +/YStep 1776 +>> +stream +/G2941 gs +/Pattern CS/Pattern cs/P2938 SCN/P2938 scn +22 30 2039 1774 re +f* + +endstream +endobj +2951 0 obj +<< +/BBox [22 30 2061 1804] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2946 2983 0 R +>> +/Pattern << +/P2943 2984 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2041 +/YStep 1776 +>> +stream +/G2946 gs +/Pattern CS/Pattern cs/P2943 SCN/P2943 scn +22 30 2039 1774 re +f* + +endstream +endobj +2952 0 obj +<< +/Matrix [2048 0 0 2048 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.68652344 -0.84521484 0.68652344 0.140136719] +/Extend [true true] +/Function << +/C0 [0.349 0.8471 0.5608] +/C1 [0.3333 0.8078 0.5373] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2953 0 obj +<< +/BBox [28 32 2046 2050] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2954 2985 0 R +>> +/Pattern << +/P2951 2986 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2020 +/YStep 2020 +>> +stream +/G2954 gs +/Pattern CS/Pattern cs/P2951 SCN/P2951 scn +28 32 2018 2018 re +f* + +endstream +endobj +2954 0 obj +<< +/BBox [28 32 2046 2050] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2959 2987 0 R +>> +/Pattern << +/P2956 2988 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2020 +/YStep 2020 +>> +stream +/G2959 gs +/Pattern CS/Pattern cs/P2956 SCN/P2956 scn +28 32 2018 2018 re +f* + +endstream +endobj +2955 0 obj +<< +/BBox [28 32 2046 2050] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2964 2989 0 R +>> +/Pattern << +/P2961 2990 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2020 +/YStep 2020 +>> +stream +/G2964 gs +/Pattern CS/Pattern cs/P2961 SCN/P2961 scn +28 32 2018 2018 re +f* + +endstream +endobj +2956 0 obj +<< +/BBox [28 32 2046 2050] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2969 2991 0 R +>> +/Pattern << +/P2966 2992 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2020 +/YStep 2020 +>> +stream +/G2969 gs +/Pattern CS/Pattern cs/P2966 SCN/P2966 scn +28 32 2018 2018 re +f* + +endstream +endobj +2957 0 obj +<< +/BBox [28 32 2046 2050] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2974 2993 0 R +>> +/Pattern << +/P2971 2994 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2020 +/YStep 2020 +>> +stream +/G2974 gs +/Pattern CS/Pattern cs/P2971 SCN/P2971 scn +28 32 2018 2018 re +f* + +endstream +endobj +2958 0 obj +<< +/BBox [28 32 2046 2050] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2979 2995 0 R +>> +/Pattern << +/P2976 2996 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2020 +/YStep 2020 +>> +stream +/G2979 gs +/Pattern CS/Pattern cs/P2976 SCN/P2976 scn +28 32 2018 2018 re +f* + +endstream +endobj +2959 0 obj +<< +/Matrix [2048 0 0 2048 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.69189453 -0.84521484 0.69189453 0.138183594] +/Extend [true true] +/Function << +/C0 [0.8784 0.1725 0.4196] +/C1 [1 0.2078 0.3059] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2960 0 obj +<< +/BBox [40 32 2055 2046] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2987 2997 0 R +>> +/Pattern << +/P2984 2998 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2017 +/YStep 2016 +>> +stream +/G2987 gs +/Pattern CS/Pattern cs/P2984 SCN/P2984 scn +40 32 2015 2014 re +f* + +endstream +endobj +2961 0 obj +<< +/BBox [40 32 2055 2046] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2992 2999 0 R +>> +/Pattern << +/P2989 3000 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2017 +/YStep 2016 +>> +stream +/G2992 gs +/Pattern CS/Pattern cs/P2989 SCN/P2989 scn +40 32 2015 2014 re +f* + +endstream +endobj +2962 0 obj +<< +/BBox [40 32 2055 2046] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G2997 3001 0 R +>> +/Pattern << +/P2994 3002 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2017 +/YStep 2016 +>> +stream +/G2997 gs +/Pattern CS/Pattern cs/P2994 SCN/P2994 scn +40 32 2015 2014 re +f* + +endstream +endobj +2963 0 obj +<< +/BBox [40 32 2055 2046] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G3002 3003 0 R +>> +/Pattern << +/P2999 3004 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2017 +/YStep 2016 +>> +stream +/G3002 gs +/Pattern CS/Pattern cs/P2999 SCN/P2999 scn +40 32 2015 2014 re +f* + +endstream +endobj +2964 0 obj +<< +/BBox [40 32 2055 2046] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G3007 3005 0 R +>> +/Pattern << +/P3004 3006 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2017 +/YStep 2016 +>> +stream +/G3007 gs +/Pattern CS/Pattern cs/P3004 SCN/P3004 scn +40 32 2015 2014 re +f* + +endstream +endobj +2965 0 obj +<< +/BBox [40 32 2055 2046] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G3012 3007 0 R +>> +/Pattern << +/P3009 3008 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2017 +/YStep 2016 +>> +stream +/G3012 gs +/Pattern CS/Pattern cs/P3009 SCN/P3009 scn +40 32 2015 2014 re +f* + +endstream +endobj +2966 0 obj +<< +/BBox [40 32 2055 2046] +/Length 75 +/PaintType 1 +/PatternType 1 +/Resources << +/ExtGState << +/G3017 3009 0 R +>> +/Pattern << +/P3014 3010 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/TilingType 1 +/Type /Pattern +/XStep 2017 +/YStep 2016 +>> +stream +/G3017 gs +/Pattern CS/Pattern cs/P3014 SCN/P3014 scn +40 32 2015 2014 re +f* + +endstream +endobj +2967 0 obj +<< +/Ascent 919.92188 +/CapHeight 638.18359 +/Descent 250.97656 +/Flags 4 +/FontBBox [-432.12891 -302.24609 677.24609 1011.23047] +/FontFile2 3011 0 R +/FontName /DAAAAA+Consolas +/ItalicAngle 0 +/StemV 68.847656 +/Type /FontDescriptor +>> +endobj +2968 0 obj +<< +/Ascent 858.39844 +/CapHeight 734.375 +/Descent 141.601563 +/Flags 4 +/FontBBox [0 -150.390625 1000 863.28125] +/FontFile2 3012 0 R +/FontName /EAAAAA+GulimChe +/ItalicAngle 0 +/StemV 61.523438 +/Type /FontDescriptor +>> +endobj +2969 0 obj +<< +/Ascent 1088.37891 +/CapHeight 717.77344 +/Descent 241.69922 +/Flags 4 +/FontBBox [-1014.16016 -245.60547 1236.81641 956.05469] +/FontFile2 3013 0 R +/FontName /FAAAAA+MalgunGothicBold +/ItalicAngle 0 +/StemV 76.171875 +/Type /FontDescriptor +>> +endobj +2970 0 obj +<< +/Ascent 919.92188 +/CapHeight 638.18359 +/Descent 250.97656 +/Flags 4 +/FontBBox [-476.07422 -296.38672 700.19531 968.75] +/FontFile2 3014 0 R +/FontName /HAAAAA+Consolas-Bold +/ItalicAngle 0 +/StemV 83.984375 +/Type /FontDescriptor +>> +endobj +2971 0 obj +<< +/Filter /FlateDecode +/Length 62355 +/Length1 124516 +>> +stream +x} @Tevfl 0(36ȈR,;& +K˞mR`f咕e\{ z{پs =p]b@N9k}C{о{;З=i+Z=E-^ #4J1E _`!>Ů*gʂ'XJ| /S|xo<(8R ^*-?^t}?3_"&NzN`6 +hq\f$zCUJ߇];pkn1-Q.,NWe؊OK.kx/`6 Y\@LӘW&`>E8 9<)yxc%6`; ~ ^VdO׃-{[l}||_[l l 2,ȣG-6r>a9|C&s]}@I68>ĭq?JI2>]$iIZ@'q@]@<7B)i\VprbeŌEbYԮ-aa@CG8$}B)3rFt)= :)W.!Hf3#p zdK'iEϺHT (DT$V$T0B9UqG飖TdإKTbE>4JѐSd}z57+ _QBL4*l>o gc]:9qstq_Ote砠3`Vj?춝vnϤʜ1Η1yŌsl9w63q.fzxO_TvC|*G(Jlv[X-—Xm— _b >Z|.|uy=v_;/]_tވ.la'6c[O؉/6v3|-v|#8 @ʰ ;؅CB2OB9∰91s/v|_ N +-ʅ8r3|_mm8g8363VV9a~9a+G?㢰pQ؂_pI،6| lF9xa~%6M8Ma3~# g#lĿ+lD!lY6Q +>y$l$|$HV | +1'zab6z@Z{3q=68m|D>g1Y,/_&hnMȚ5MDxkJל][vکkO3KYשRo 66ؐ > $!ɁO~䦔Mi}ӄM+6lڼiצM7͊ 6lln.|l Ŷ--)[:m2r˘-L2u-onYle*귚ۚu֊mئ6mۆmmq2Eeϗaߑ+cא]V*_Ň_fwkvs}Խ^ޔY{؛Cw>f_ܾ=}oUWAGq1htA_ H ėqJҾLە#mLZNZfooJ"mKRJZ?5<)SRHy+6!KZ +-+Zi-nvNo޽w)ގi''$swB6q[ŶtǴvռiƍF5pDm[BC,fѠt ZTe,CSH7$9+aohrWHqp6ӝ]^vve7N/^SFRxⲽ2YQV[2Q{6̲;}͛yÒvRQtmȲ ғ^ddGcE=Ef~mvvuDkȼLjBS0-G/bq"饢8//1zvx< +OO9jMMһvDtwk׬jU#y*y3HTNv$^#)C Jf)EPf^Hnx$uYl6v 3[a}R9jxV}X$b7SM1P3Rv- R IHҠmKG][n:łӧ$Լdo +☰:JzKK2z=}SzĔܔl_t+za.(򚜜}y3RSRTr!3.?&!Y]V?һ9һ ?˒۳ZBe͛wϝ>~z%BQ?sL_LO͵I#-Vϰz?rHlLޖo,8]]'8ʓ2iMN6o$g٭y)NY\8Lm^*_Y׋nY^*:;*nY +#ڽ͛QAޢY{Yrf{\12CL)L\#_BqJ y@ OTfпDV$=RX£h ʺj( kH.-3%hc(xNqkD9;;;I E^*9KDgM^[6tNlh^(;.2~"Fb$$L$ rSDBbV0'md-{PRV.C?au x?;T*h'jeD#ճ5CMEPgjmm|REEҹ bV?P22bU hh"ࡖVZVB_DX^X^ON7Coա>BL_Cö\A_GU8r 5(QN^ UFTxh|$̍Z|-G#mZGOGϽ¹!N":7pߺХC6CVu|nn`уAX񿈞mzsϟzW"!֌^z5굦*z=*r}6;*lք~eW0bЛWcp} ///!C?KG:^G61Iaȿ@g 6k$7rգV??c$z887?>~*l>& &n.|ELB&3%DKb1T0){a"S,'seFєEL:.b:^>ou"N"?Mp' A7w_0E&@<<|_̪ +׶x6;TD~"uJkBc5e [i?ivp=\ %]p=zkJS~JM|Rpnu{&[g._+(pWPGgZ +kI_SC]סw+W]G]C]7gjN#UٞVVrַ[ѵVumvģz tݬ|i9H kVMCuU.yV @n:ovWT2U [y]s?66,_&ϟD;duxuQV֯Jjw5V+nL_w=CtNZ^mi=7cQ{Q*seפK3kuRCGJWmS#_]ރu.#5{.*w۸-W˹ǻ<{9Ϭ|QSޛfmv^+7۾._U~=ƕߤ< X>^ֻ˹=K!ޥ7H╛LhM-wtvK1ߺ׶?hı.;˷'ey? D:y"g23J8<Rɰ˪.*)/z/!iGͤ LL#Jm`rQBQYfe-7~1ґ_F"9"?ww3xtx"T,KAC4i®d +Pr +DĸrrKLqŴ&vCoz;YMfFfL\j_ p 4ꯤ$AQhE H F2}C.x7=Fj>h?"/RK\x\bvjo'Ղ*gd -UeKaIBp!}떭1fٰ~:-J39G@=ǖFZ+ȓ8=-I: G,v?iZQ5 yPn-Gbyb9Fv^<7^Yb=Q[Hèc3T8zRKMe׻rrǣ<":nǶlժuV-:"~k)LFޢ+3G]~uİۖ|ؾK/\Ɓ 9Q>;F{ +i,<-TqD{۩vbGb CcRPy]JrvQI+.GF''+r^*׻]n6cZŶ;bݶؖı`qD6Si|~ѓcI_y<ĖVt~uVѕj3_L$[0try^CF7 ^IqI6]C\nWV)ֱ~戢6v;1`|1gtE_W|n5ufq7rwQ&ݏ`gԫ`-lļq +3,CRLyJ}+II,$4tDRf_ ሄ8b,$9"ea~!{h.H~x?pá|?GI[2iRrG QCs#[ +"=(2FDIQ`0cLϚ\Gv_؆|_4I1 e2AD'*j9CKsZVqFDDL ptƍUCW<>>`v$%7shZjݰ8F1J tY2c3~Q{7S%ꉏjmý{g +hCtã7O=gQ?gGB(,9<24^`b,,,aj)6O+_rI˥x469"ؖpHlTo?6e)gIء_/,~t#8%W 0ǿG)}fMWEݔ| jX %FJ/.Y%N{J` +YM B^`,(OtIn?+I=9R{-NR ۥYţ"Ű4MwfK/zҀ& l)88=fਠ JV(Ң4UR.sKnݪ56;9 +RjI)wfisG}zq-03iUaBG՜-_R`KaE/O,j-D\8Z0}a ̈́s9L.>aZ Htr9e9U/MQDE(Ȯo!ؿ`H H}Գjdf~(]\$˩7&s;&taB Ϻ='el)cafV1YiRE+/K?^dC|`V+4e>ߨa?MFF3 +ՊgҊ{7zJ1Gj1& .f+40(9UomI9"L26oǒf߭O6@%"YHz 㿑`;EcHCcI6A5I!Ej5Zр5k_U6 h8(|٤Rα ZF5Ymd*6RV@6!87 +q*&<1\rbo$s#d8%ol\5_ˈm̖€0$y" E5BBMBNdR(iE@%6t8]$ۙxmw¿qwGθHL9/E[0X8J<>|:v{klh=MK0 K]:(%ZQNEsvN>>'G\J޳@UeSFloefSE#=ǩOM'f~6z5099̲[~O%1ۃ;g"fW=m \ ,UHJD;Wz~_$}fߛԜ]Qf!)gSF (TuB&&ʭE46ޮGloo-OZH=7KX خH +9E "/Z伎V4R".)&LZ;[lW%~=OH,0+eL8%w45r^xYH˚&C!F4"4O5̣֦ɌVtIC6"'qZL$xƻ2Q}E2H1`fdVⰊuˤX.*Ji!H{~Eϱ22DmMmEώ7q|,*-nW\RQҖIUg5,;v=w?fxȿtCya ڝ[9H)$ /?KߚOI;Kf =FL"ĨQLRjbQlfvS.3(n_qi ';2o|c^:q4A:Y?&4Swciz~Lt@0 fGyzh׮g#% dT<2fR^  `љubSC4h*udeٯ}tpA3ъ:Xdo0-IM`$hUob`"&geh\"~7/TI1%YP{N_FI[.>Yƴp4XK}=K&Q~*=eN֫Wr'yɃMm3|Xaz_\xi :P%$I UDS^ N*XS#$*i*l:㡉ףX?; 0(=iiӅMf{DirvRZJutuN$&Z w 9QAEY$怲AZd?B0}.7!-E< 2Y҂5ԋ/jgN-r +rrrk${WIUI-%Àԧ${h6NN*~> SDoXNsGp6]jqb׼q h*L#=@PZ7Q02b#g4굲bZRuz"1 WLe%s_71:k?_[jω=|D Gtᥚ$:ZS(r!L}qv~&l;/\CPc}o3FQEi&B+ZGebʻ#ɤzrVW4׳o%\ XaE'<$P&#tJeTVYAiVcu%{wYL9nx3%Oqeu]`/ +a#?~#iW/H7hJK +9] L͊NO(c۴t'R|12)CAӎŒnPSE:,~A%AA*iՒwK*wqO/J +Wێ׾U_(da̖ŌW4mhI⿤ۘt +2M"*P Ұ5Z0dG>{ײDDwo%]_B:[_!;O~B+ߋ~31|尭&ޫe*\ds6f3֚Lʵ* JEӛLz7E?8ŗEEӇ:4vl&Onߞ {gv˹Otd"V2B!YGFp\.BvEMAޖ:zA\*H.ɴttppń[10n+ݮr酥IJZ͑2yVj}fg|JmJi%3VNo?&d{WV*][JSBxA4))D߂ *bzp,gX]@-S")rWNpx7!\9D?I1F߬R**˜5OkЪ$4b])B'yD'`<14ihݞ|5ѩ&jXBڬ0QI0<rR=뻘֛Sd"&! :iB$rz^‘]8z#uc8Wqr. + +ĝ@(DF6%Uc$ߔ27YX`~cyL +h7M$& t +Ms4ah2~^AӁgX>6^Mj Fhhi6Q;S@+uA+]]==2+-_Kp8s +v?p宂N^Fds9YLD;p40#BȂ} >Oӛ|C}lJ!*,n¨0#?~X4h$ Dusgwe.uuz՜ai i),bcfkFbQG!dV 9r: ) +9„pS=I%zKOEzJ wJ֯+G\huqk5Vdz{@ix~DE{ 悯5;NmŒ"7iin6F3GӰa]ܽ>hg"S$XIt$cm('0tfP6ԣէY4c`h ȥI(E]j*QMCXZlY ^. VдE1;A͢(/EQEqƉES)4_#5e%`9沌d`Yzm"׼̈Ni̚NZ<褜-ҜȨ48,nNJN𜂜9\Y*u]΂Qn9-N zwY0\Lucf"oH&odfllE|>ﻐ }9vpG|~S'w1&/y>K*_;7s{|s4iٗHkn=;D&[IB 3\t06eJR$ÔdؔJJԙ͢$LfL̔ ''|9%gXm Yl)LѬ!qFěVߒY??B1=ߟ//;X1JK9?Z3kuL@_0\`D< +i@Qii}KllhuD='zlR G.TT.uzddp @fYNNACgɋ7 =߀WB8snjѲ|/ (g7h ̔^g+=^T"j\5|4YET*Tx`].4M\sؑ,hAz veYfYQ}zn''pln;ȝNyEq'wVN\ Ɩ9Q+q]d9g$%KP)ϾViɣ/`0Jv2QBG9S4mWy'2QEEAE%*J%fU(Ѣ+"+gp!Qdk ] } 3 4m ErBY*dXYN[\KrX$V;8`,DGU*&|W\®$7/jc|{ ߉8[ӳ䝮D|OCN&#g|Sw&>F?L^yMڛQ]y["[mEvT|`DCx8BJLL3heĐLC 0A/ & 1 ;I$g!~snUĨYV{sHi $+Aؠkv]W(0lҵP|eRO,MWXڊYuYBGYlwĻB0  )HQGuUD*- -nPits=t5T,J\D,`'Ibs.5fMՐ(Z820=HÝP h,drYeݷ'K`C7o-';"-O(Q3DMՍnR.J\0v͸XEk]0r\yXjuz\˥FT ʥk8f]q3q +nb}7y6 #QRn~O=c+X/ i= +-0yM#pAGSQhKh{'jDG3Q1LiCp"HOZh0QV U +#++`bNW@)^jڤn_IiIw{Ӓ4腄m +mxO|,O{1<3h +B$Zɤ!ųSt ZX[Z^+98$R q67//7gt6,Dأ/bd=8o5?9-7Tk"'0?de~ !T4=MOͺOw7;玲v7u}kPGHl"@*NwSspĸU<VhzbcXmpl&&[*cib1bez^4 e7^7Jj%]bxUZ-~_?~Ӕѐfu{3L6cd3V2/v+ r~ybAʲo +sưBBjޝ 3]nۓljeӦ&}i^jY|TfGi ikz8V>˕KrPJ*T*T*T*T*Z-SRR4$I礼d)$4JLU7,\q?Y^[i(9rm(Ql٠1K64 +`|n43~ѣ~-ۓ'llvߞ>pGϼȾ#t'>OYN:i`Q!⁍z8)4N[(ShX{=>̳i"Π3s(|>}=iscqaG@:N,֫mꐚWńGu1Sj,]AEv+O\jZYboP]Hq|=ùHS p+Dۥ{'&nssCB_@o/0ٕN"*yHQumy;Uq{o&Sv:hNu(mwL+B8$vR [}vU-/VmEaQf¯bYjXaM'+oL7>FwA𓌐8%vXO"qO#5+wdVJ˲ #j85d [MΝ^@YNцkXR6uʒ:2UE[6ǘTfO9/WYDYn,_a|r^Ֆ&0V@@OHc5(zxm1䪔cY+PV^Xr)uVe2e<7e'-#v`&Go4#)OOw]ү9sqm'(mN; NUE:-ΈUDx\<*NȻ6Hf~rv5VX.UW/Y[iC*n3o /\Vµ2TA儱_n&xTRȧSHx*n`*ʄBS +"ڌ;Ke!XXŲxr.+ɨ3ny Wn4CȔ_:`-Vy0#RA~;"pmäf*v;pXT"g +X=PI*UPU3P c۰ڜ#X]|(t )3(PN]٩3=>f5npZeqOz }0ߣ˒rw[ϐjH4F] k qiSJIk\ymp˥3P3Zڒ~UJlEV/c(8&EqCkm=gs'[:;K b!l2LFeL͞:ǎ;Ǭp&-k)~`#ǫ~S}"-v.2@(aud+ό# j',ap oxGlw{{+b}wUv/x=\_Jx`g&=uȢuX'ow]!&\tWvGds5 Iyz$r0klU:*MK3.暴d3ChHv+$^ًBqƟ 5}Jo糑JBﴝ,fKKF!H&@pT,mUڕ#ʰ"&ZGWe[<z)eT*^=o0CN d9$|n-jt:?,*tH`YEyn6 ;a=l76Y4Q\56F7w&1A6,:#3/$zՒ"+ݟ3n~7 #ln=IэoA,}Wn_Iws!4~LmG.Ek-V!(9C(]:a+tM̛ތWDnZ]>πBz `tI8)8`c a@бlqbY_ʜ )/ (tA]jzRC* +͛y>[KQWkK +M66Ӹ36Osp1X?E$KٕC=E!g lxbA^}>Ie!7WM[ UJ^l~QE]%AxVZZ&LyrU}\mձHH SgeU^[ybdY67cẀ͠ƣp3=vb~ҸȉǠ118k6%mD&*1tهbdUZ{bRRH$[tJ:#1I/O%an{T`ZQqNF{_^ +`F`/ruPJCtgdaX;A6Ħc4ãj@Yo=XypsKs$qGgh|e޻?˲mƂ=+Bo7ZOmuL:Q(?#8F" . ty`gJɃj,6}ةWJ !sPP␂4n!)8%+㬞6ms /$ kj0^r+D<|LJD=((8l> +0~d6:~?h񏓓{_7ʫ? + Ƿm +uVϵ +pmHUZQZyqCd7OUGlj#wAxG֡[:h;@L G&2!vЮJ5ėd<<=[f«Y;'=.%/^;]nFmS̊=p/Dz O!iόz \q}y*rIN*1I40ǁq)^I.B TIxstXJĕbĜYswY[Gd_m_yۯ(>DF1K!Cwnþ GKXLR襰B QzR!^˒-&_4"A@}<]*Ի\5袍.q3^77'Hjf\؏͚_Xg^X[;1~~ga-,D7dҸ1.N7}Xo_+v̋4M">> +T;.֩ kTFݮTkk=z<t&PDA0 P&΍%81:p杂̞rCǙp6:iI. %ځ c(ծ^L%\P-1Ȟ]PslDX c]$YQrW!%`%5?>A8-.rd">BN!5G%I_QNaq؃ÛX<-E}* HA6`E_A*hMa55 nK"WS|h;s{Cdd0uV/ +u;lگi*!*$TF:͹^Y˳]YF@! /L{g4i/zS=``(08dwc 'rӈD( \REGB$a4KUl*ψs r4resx揢D'ހ2cc2WM9NrYtE}d {iBQi(ѕ`8kAO0Ƙ>4pEa>/DpPPi:&zUP[lEz ߵf]2` XŸHWu^l<8]=i=hVZl"-w!@|X[#po%,_gQNL0I3.jec˶MX/DvfD*ry vbXOl0G-g׳_ FA7;f:3Q̤j[2 +2Wc,wv ?5A*C02=xD`b(1m%0J`2.õmb8(J)Lļ(DV +mfQ}>~򓧆~Bwu:y?յs*JE^ zXmJ^Qt5*= +UԄBZP̷H7x_y"r#f#n4١؏ڧ킝9.K0Fe%%SN?e7_Ӹ2d肿=Wi=Ic]3~(F_=s"A'AaDDH& 0Ϟ$,mz(|$8#e$E^y$WWQ,5(=72tS5>ɪUiAPts>Ƅ Q>i>\F^/fb(Lm5L\Pgx%֕(\MC?/ 's}_6bpطp;=NamՑ~Ƹc~8.L0> ""h: !h^=2\f%7BuczfLTsT*ao,PAێcc^:;U2~xgUiգ\C׸%Ћ +X dMf/C8q\c y #a>Ea$Q9s€ +-^p ?x` &aud!Kݼ}=qÝWp`_N6zEՏ-4wr+w?; ~wc> a|/؋/-ZgM 177z 7|3KxqHNX#HyT֤D`zdAU,vʶLe7ːLe9 mxaG+BwD"{#.2}Gҳ:Ϗ?Ja>͕X>AdI0aGH^. YrDx9%0;f}ܘح1[^267掤96y1GWZ'߳1#_k67ޅœ~ω%B;2Pxz$X|q(8I/pȫN/ ب/֔StjZ0c1>@qi]A& #ӠusX*7ǰTT U 5Uݢ\GUi)BgE/^/6rUktws_e}^;ʳ)\ld/'saΔU;ȻvҝC1DX,!ÙKaA(UD _vwa0  cZH CiQ7- 32HQY]58,D9ik/Fy~ߎ4.[r+jZV'/̥ggR~H{衹[q +,5r}p7FǤ9V*d9EvR|ikN_Bӈ$ҡ?I!^!sa.;]1s 2ŗSnS]yfycp:1+LfbTzqT ؍<yFnZZ)O_! +C| تT,Dմ!"91QL3ði7W<ݕf_vKjjF'߂e +ko{Sf@6%& RCp~HU3RE,[R(l& +v$< qÁhEB/CBҢxZ^6^Ƙ(+ (L"(h5GZګ{Y5+5*6p*w rk%&&@䛲|T4i1C}'"9$ 456W}oɭ}MÙwO=F=>zr>hQ?RN!ADSihw;hr88 ^Vs,RCb# 0ERE EP"UH%c BtNg!>WM'tv xxh@oDOmɲ2vt=Re,Vu--ceek=qVoӝqPu[;[%zDANϸ2.~Wkkk˶z5utZqe, 5x,'{f`Rf,lhMJ\f$<#vn8x~vdfE G`Le~ &s%\ SgNEԐˏ?:+Nov@QSU?.„ˠfah wÂOU*OҫzvWWT٪xû&]U'.xR~&WaR~&WaR~?+'J ϴ&U)mw[ff%faEo 3AO~̴Kr XfexȽWz3ch30Ͽ˯yǪmoegO>Il?om5Jݶ+| MD'х$ lJ"*X6RrLeJr#3YCk~XbZ]BBYE_4eF&e2wc_yy" }k3QDq@.K]BK >zES`2WN+]9PyX;i@TA!&% لclH\ w9+V!A"44Y 1cr^Y*c+ΐTYE3iր&~u]^Q{+J*v>̈.?Gsv%|mۇ⿗e0@/Ac[ Gf:羌+ŒaA`8BY6㵉\2!.jT6[!yL>'e9% %j"(;xIHBi/#+`uݛ́c>17!?Y/uŰ)[s}K[Cvk n >'0$%)HoE}<.OnQ؞RTGڪQrqJZQZ0$  o(~/K:D٩xv d2>i3ĖܻNf;&'s;r V:!QugjU֎ ai CQ;25#WJF@kŠU\mW/Mc OWAaljU:|0l4f_H!2}@: N M&1+3q|vtRS&WýGU3- $uChKMjeگAFF4 +д"(zgX"X9)w:LDμOEXD_JG0"K^CIm@۫jMܢj Ǟ&]p%h<bVdi̓lC*ހggԓ;==8tB\Ѝ]Db:\E= +-4)XDqf '`9Q(;e<%aNBQ>d?DՐ̘~;f#Lm|F,Ĵh zctMlOpqDēM{b@e-dx2|iB&$ǨJҠ VW׮(3 +S ++x[:Nq0JuZѓ#6۲%uonjZx&pF>,1iFHacrÇFBn<X;y}g?@ |xI"n-{L y}pZ R+ALӾpG"d9!7"u _ BbŪ`L3oKI#'٭=tX5A"k}? xa7n jƔK /z֫{w{Y8K="QzdLNZpjjRo';REeaI(sӐ +gֱ)"}Rei#䧺3HeTi]]B ğVn`wwI^ɫ*!8}:珩LҐ(*  U&G) GL%̨ᢷͿ1Wr"qŜz`in@mI &7qvtxn.(šHpt6*(NeKRXd^Y^d)F>׭c[M1q +blȴͣC Ca5 +s+Z2ڠs.l \3AD'-P-*)f *qym}>Gi(Z.ft,, a_;:Fe݃%|474F2o;Ps(f6ZU [b47lE5$}2wÓc~.85$n=Sfw94]2Em5لYk*K$>PJRȡf 7pLs$ O^^π +SLdU5`^b}(P_.d~ɞm:k)>sr2n11#Evpd<;jB t[l&OEލ믦.H,r"OZ a YBP1S% E}̈́l}54BٹG5c | iz M 9 +r2{ hcuȼz EL/2;,}/!s c+bi C>e ov/ _|Avw.:lTg|GG'᧐CIҪ"6{rUDI49G\EV. 0Th;p*L0saqqўYTyʋy})_U_GMߖ >܅gP#"@h$tT04(PyH"4D; +y=UVڦ-s +phs27-] (ڥӏ11 ~-{^'d ~.=Y}%NB5;|yu?ig2u&.:b;2gy3𘱝}14Xjj*{ z*5ݓD$'M'B?-N/IRڅhR 8L^pFaoL4e}Q荂F"3ſ=i A z53d=YemaMl'pc4pI jzyY@1puqqNj.Su!7w<&XOx󡣳d[R\z|7nǟS)b,4{ygNe7">"?2jVrI{X9),#}A- ŝ>GEq +F2&d9GbjJq P)5MNE| ̸tZP\ b05ssBͅAPQ/e*hPrҪ9F+M. OWyaw/xP4)։DY܅)X =$kϲ l/;h@;΄&s+`J I6z1Etb}c>iim|r-Y\lY!W[ uvֳH]ӟD\Hx%列xak!o0ʷ bK +agEo +VV]&n*"ʴNY;>;12pIH ^j^_FItr1'/% +nso37}ggsA{v%[#x +'qJjR­(#ĸmu6lPOqY Y0(" jŏ8OȞ\bXXbn%%5k+@Qf@tD{SRFb[=GJ$Kalwݴ^< FKD0͟is/Ͽ?⇤XB#S![H/MׄzC܃VHNvK /nht&P9e "("&(#{ ɧ-{`侅aDƢuzn01W5Q &a?nq!hԯA֯ icڄ&jCڄ6 Z֣1#Sy>#g|I@?Cn噔Uiׂ|fu*UHPMM~G' 9b3vGs:h١'L)EA qe2WVV4h-ZvNkCsh̳9RHE|NBAPG3ܗp LZRpR(!:UWB4EEQp;H;x0煿An wDNN6PGjHݶT0tCYؼ x^ y6e5ejʥ2(;RqcaKk +`EX`$p8`ۡ ZFN)[m +;@ҧQMQC`%m7fʡw^>f{ݣ5a [1?ó q5PL0MW:"i/M4I.hb_Xav;Ml{^,Ss Mta֋WNm~GqZ{"(qXi*X:ʳIw&0,e +; {$560$n0|$LD#4"[YQ(p\R <^*ыJw^gˆOakpsgqCsD(&fn6$Le#B[Ϯo}dO]|+̵ũ HWݎ~ǔCp_38 +(].Vjp]B#>h73hOt7W Bh?稍 \x\AaG<=@ -i{Jרճ6apA=򌑎34B)sG;]ƫbˬh=WiIA5 !ᷤd_1&}+#Y2ndfw%c~pÁGg^dO8!x`*5s0GZ_.x=\4cT;)9;m $"h5NO:q57w^7u;ҥ3 +L)aOP*ˁ .+lT?ηN0Ǜ"*̏i ӠR*&.ã"ÂX+;V7 T4÷7tXVҩmhiJ["Wwyx}#/{~xW߬n!qp]”akj߳kaWWQ>=đR~eP%♻B !z&CscNpyS^@ +L@$XOX"+kb< +="eION|J˥Ch,[99/\(4CBJHGaO3Y#9i58ua fxt!g}K3TL_;`-?S'/0/4B<ִwlvqF1Aq8e.q~;K3qJ I ph"Ý +9Z8n.םwO+-<(Yf3\KM# ]Gln6{Nh3lO.էښxp_&ZMĿeIiFS~ېmv&m`W\h +w:pЊ!|Tyq[G5p%y`Ĭ_2>fdhÉo&-XuZ~99C"w~w f2;jc;G~V@XWDLvF!-zqp uޭm^J;5e0]6SFih:e4}H;Fm6mwצZ@+.*t v& $f@K{$o*Sr& V]x7XrK=Q=twO~=+0ٷwR%jox7{j#;n0~X2?7 bd5oɀ _oow'Wm;`;p$c%0!<)!vL 1q&i?YR-XB5U'm}G_>LgP @P~+_\0׵'1;f%7WssӼcy6x6z<<=6oZyk>x=y yRIJ;ǵ4Я$TcJ^|')xJxΖ|\~HO3}MϏA=ڒdEA FWר vOlF:吆u䭤:@-$*S|'gxmaxa0P7,V^$XSb@QD38ctd,U~ƥ <:q /M6M2r{'?ػ[/oD~crC%\J<-q)ߪ7zoP4|0pU&t7w5߳qja!T#w{?#a LCZ/g񆼔z[#d[MyyFwy{CތJu^EHm$_:#=+p.R jQEEBעEt"[OYrS07h޼E KT$N3?S :%ZɐCi0Y/HTVbj(U-f ?Ԭs3$sTA-?AqfUe)ۢ~se l1D.XT^w\4Q^*tD;G $ ]{[[ssmh<'&*o=p썱ɇpa-CT~kX qRpP>>ofp @|lO4c8y:9uj'Aҡ`Fn Flkqz[l˺-N'gzZ%Zi ^^#fKl/7שb1(CNq»rW$쭞JNWOO|_߳_qߑ)?rXk8^*g:OH#ۏL7ʤ@UaGO<͞͞}>A1τG@f.\эQzF!^ܕh(ЎEף0Jlt|sK; I|oxD䣻Ap8bllrsw-1k:Oi7g6!8AxSUarRXcuh-eq6l15c{xS;GP ,^2 F&xJ0$\]hc0w6pd4{xlavl*s"m”eA(҉ :N>E`zTkrW:c<<=p3?eJ~?̯ë*_O{;ڎ7stϞIqL|M8aYH‹#9FcR|䁆1|>mBf|Vw@%YB+]~wOA)-_ؐ ܂ĆHrl^Y5k,ztf60k,: |ђ5kVa[m[k}ն6>if +}K`ǒ}K\|+Jז6;J奫Jהn,S!d0EhQ#:j-)E_^G"ÚfFc+RPW a ++Qqt!ePО7Me +a/L!YO&Ҭ͠uyͫH,\T5Z}>'S*.>tVGQ)5*&{L0ה5bQjQU}!:_>6G>쐼fϞ.s|^ wP>*p|W>&K>17RVg1e7|'S. +(te +,Pl h g%HX%Xxb-†Y*-Tk4fTh0P-Qo z@I!=gc:+2U+5AEЦ Y9Fefk7-FMv{60w%CX Nĉ}Ϳ ɻ PĻ/}BG!?&KmoowOYR`:DxzwQ"./Pȭ)pwB6B!.^5(HbhWTB't QFFe%Yr4Qp^z8lJy%>|^??vxPwߺլpMa ,FOwrM`~{ 4J") [IjbI` Oju:U*UNYSP1ݎJo^{%9 ~v}'4kg ?ErdoKyKFyJQT%ۼp "3 +DY+ +h@,((0_ :Xg&:g.D3LvYJPZ !bZ )CaĠ/A 1ur碀>0W6-97RJ +) Uu& #I9%Ѱ$fUxlb,/pS-\+/&>񏓓KoKW cwS0OnmmMo7qw o.q綣>~_wC\~yMe'by VxIyIQR|%[)-D5czZ`$J cf<Tr *j¡d/9h  jQBjF)Y +0;U!,u>YX,WSBqx ígD-%ȿ"9qr/N⇟rϤ?Se&EjL~OmxK)'?>`厼x SP>`xm ( V|VhЎj6`s +Xй!N `߳ o+Ysɷ`'$qvy1 \dUUd I4 aVaFvˏj3[ ߜrwvqW:Q hXA}²akg7>6;6alel +} (M-\е`h! 8X7C7!4$B$C + +sDgH+MLjIK.g ,um.ˆ.a"e9UCIY4z~R?Ia<> m/h{# +*[n|yϞ{ٵ둿 GkyfM{Ɖ==l}իi:FOsѴ7.J1*{ޞv + @k:8^h׈epa*1# + +sDh#ڬQ1 + QV'Aa.\_y<_̞=Kb//u]ݺuOK_Ao?p@QqJY$Jr>V{ȇh?YJwWګŎ(k044*I:?qC]JBwvNdB +l/%RauphPWPZ8\~9iU`b-tR4ag{ת x"$?ݗ#Kꖜ'TiHǹ{&ܲx>t-@`.YY)N]̇UgtA% YdrJB9+,,X. Ra_#?g[W^܎:^Εѳy?t07o~?&]ܐƺW$f02[ӗaf%>s%4)=eh4a ـtr\m%8SKN D_n%"|{ I % }a 5 $pX po3$+ `W)[{ntCeM^QASVvM'䢱lYό0",؄z(nsU;E.ռxwx=ƋW_uj<C{0t!3}\5d<_n*!)CgAb㐨eT\;0b6Su4DaZaN|<.j +EP#/o㏿?}\!rIܹ@;ٮg eå߰?dmL@[7(|EfN[Ap /Ț Α.wX,@C}H1'X B"OiOh0p׺r׻[M;`q:\#qp)>?hwvXn"{zbCb0V0 h̀w +!\I@~ȩTTXìO1ParMh`Tӛ`F,mSO% <’c[^n$ؤM9 r/K:T˖ Oְj^W3=vMc-Lã ; ++s{h)r1!֊bG7bJ +s +zS#7'(2<|Q|s||D-'v2mJ]<ٳU>eO"!狐7j-Æ#3J=( ƾ~V3AxwwZuag/kO|6yiOny`/C-;++kmN1\\pNV8iCصZ0G/=0L6uz> 5\Aab;k5%;CaM|`fHp/$/z`fEP#"T 3e.c$N* +!"+ +4{#` $ +A TS d!"4YNi2BVi p }"Imj4Ⱦ\bqɪͦ4tZ0\C0461tDG-u?k[n_$แɄO~,})C_6֦o;y 54 fThߗcXbt_p5TE@™sN@U6@g@ \8ʮ|su!_B]!Q$s~!nzܾܖ{0\- 1rpdl0*͞7+$`8|zH=ߜ485>]=)YS! V*ƍN+  #t!(T|ʭ%9kUGF"|$J8K0 3 u +j"W\/9%U֗Р=+_s)HfzK +aYc +b?C} ÈZj{?O[?^8q̯Vϭ:;;7WEkQnEF!MDi4Rǹ9_s\_$YiGEVD:";""H f>'pLR:Uo}xl63QlW6 ]oSϕa~_.jp=H!^pA+PpU5A9+jLft-m;1*r uDE>9͎J@ZڊLjceajke ,5в&L&iXpT!G)m)Mߘ;a|PDwLR~+V7"_v =/Ð9}^G}@|>Cl[ۗ|ks?9OL;Ja-IM 2-a3E}I\e\>ș{f2XcL?4,%~:>PO +uzB hI9\WGjG/Vu`_ݲE&'0SU qGLg, m^(dx||@^>P_,_ +}5|(B@/1 Y@aU&=K#m>w}PK)J^>hKFzSDQ`< mHBş jIkQft@sQVTZ Dc.7sq9WYY^f\c}xЩ&þjd]lV:Mjegrw<\/_|biJzn?Z>.ya"<J]"YmaH!Fm:c*A`n5zоPޯO%"CV{0\aSӣadmPM'6rec&凃,?x%FB!FCdBlR6# +Fa<,yL9nDEh*P"#[G7<'Fv~G (/ed!l+xyR*nGdJKDK"eRuײ:O4U˨S)`%1SRԫȍKfS٫R=ҶWG:s7ǫxs)KSɓSzAg9\f1h e +PP n I2XE@Ts-zU?r䮀Z}( s dAgl*Q%⪀r ')Bb,q,}O . +(_k}=8M ~⁁ 771[(JG d3}dB`!&7ؒf`7g6eCpeFC G,V8ʁG!9@r p;MLw9 )2zJ8p[.9[a={rylxO}FKy񳺿>VG#M^Fod)k5Y|Wr;jE? ĬyeIΰV`eҲBoKv?%hP=B ,h_댎D3QMA1R%ʒ rPk  __R*I܈ `U<؂dv&3H5_o[}ْ2E8Ai41F5blfV^3!w~xxbg-֦bkG5qg -{1E3dY6375TZ`"(ĽIy“ gy6߷kr kJ֨SdD* C!.JE!DhOWv渐qs\;]P.Y]G^?0f.s͓.y"uw|yt|41?fw2)J w w w w Jȗ&vtZ\+rhpvsQGkP 6s좛]Ŷ( +ݽUkoIg&]WTZ IQ! (kO.р֊UW +SP1nfԧ?~Jw\>($=5*p.ہ[.w v-, F>GtKtlik7L3l[nyp@TٖY^|hmݎi tBX>AxEd'b=sP9k~ݦi"XzJ_Mm096 f:Hȱ@"9 +-M'I A&W< v^apYlu]t탃;vݳS*cF󉏼1>DbGa= &9Ʀ&E9R}<_/o|ppA8v -aN~E;ʤPۑt+t@b:0\Ftpt-p1蚵mZ\ ǵ`+mf8ΏC\.ҵb&r"LG-ZaY:,aYX6X6Zmr.'"dH #h4f:n-/[v%EskZiXJkgX.+4X[Ԛ#LJ/pF5ҖcnhnWڭ|Ħ{/?L2!̕l_(>  9L3,Yfp%=K@E»zxŸ 5=ӯՁAV׬tNo +Sh (5Pq:)]jBAKH!!_]F-ihjIi%jTLr +Ugt}VS-"SG)0o͒OUsL.ܚʆ#"?k{n}|c +~GI> )o=vgˇehI.}#N8KZc.ϊT"xE0..)'6@l@Tva-}J rP uC B"-IRƆc|#_` jnQP%&n8+,`5 oQ.Kʿ2UNa|zV+4Z%+*BǍ)O(3GIŹsWavqP_7/n<*;IveLf2*Jҝs_ aOgw"+sbsNs!JA`v>VuhA:B_O[p8^BhHa5V]sqOw}L +ipЮZfaŧq˝6) +(Ϛ2Oe5x2{ض(o}v'u:VUc" + W'DAqL$ Zty-!`deؘD#NI` s6):'ie6A7Pka\%cV X-`K|"KQGE0y!!o~+2xH&[yqeÙRSCcΥCiexg"x]ZDlwW!y7_wm=G'X>WGx]Z|ف,yIz;qpE2+5.;?"""z'B>~+Rْm=E|(Tr q.?Ȭˮ +`1TJb.M2^Qv2V`aZ 'wMc3%۝SAmNfTr^5yP34~Tu?n0w+G]~s~z~?lǝ*-iAl, +C/jdÎè+RHZŲKz|<)KIdps-M +%Ch4 +EO}Gwk?0YH7,)VvH֩:.fڝӅn*gnjkfȰ3Fq`?k{aQ Vn-ē gص`ҾEL~M@* 7wW)w`_X(zޢt6=J$H&s0WN܋NN sbz+srf 4@EٵfτGx:1Qq?/os ~<~h5EN#XacE~AxۨQ qzj6 +)#wiNU`FG3\[(x. p_Iz@9 epߧhew|rWmUe9Lo][pt[q&BJӥ+:*@@u!H$ Gb+C%~ 4v/Cn)[ݴ 0x5хY],< ̂Y,U8M"v&<=~:TQ?%(B1 3π}uj6CW EbhThQjaР(>>4iTI㍪9/.+|Қ)>c_ϳlҚrU4M(99grq޿u|nz NgOҊ*?ɥ0Ua$SW/h=(@ 1."&YGBnPZQntТQ{tZ87%ܲZy0o~^|eߺcŽmi K*7\)|)O[;u곖23$wD%N+,y҆:6)gF6s" + OV; N#ňJNLhʵ%: +FvvTKSؑ\C~)⠄Bqő"φ'<&=zh'mܑAzz7pݻjoc̶-xHΒȣw-rq&b W8)$>WUVih7h ڍmZgœZ-gdThMǔ1.P)B:M4I$MÕ4~)_B `2kGZ~@ ʚR*c9fAl`:T/)CFfD\=$d*=t?tTI+y|6N\xhށ˾:(%'9qr#Gֱ]`%=MLy$ 9h(CwB_(.Y#TPHLPU 0P܏NTCE~ #v ;H |SK&gCWsxB/⫲=J-7 'ONYicW tPHYA0OX- +$1㧇0 tYTq\f͙yy<86N4TY<+A|JtZ!#ש񋄾ON=@ARr+:U?(TI$-Xde.q~bd14 2y."BzuXͬR3m$@fIV X6oG ;~gqpFp6I*$]愄J3;Z%֊t%n(qorS-1|Z  fgp)yB<sUzEoԔ[4xcVrjT˳jӓ)IOEw]@ă_pWVyЂv s[#_ٵ]ğ/~rczp㣗0zGSe:B;9KE`[4&@/}m- cj +*ە6Ά]F#n'umS`Yzyf +qxR*Y&tUF,׭]O l٨'0kRq~_h+/vDL8;;ңKܖtWrgLj46Ѡ/+N} ʗr|yπґ@">\fCѓa/9lF`&֭c:8+ML79LGM\̴ıUI@πZ/8\̻wW$^Й\P!dUbBa ;X!jUܕBP/&>d2CL(Y_(MZd|xn(1lzIVY8#xJOd\tGe#ޤ׀LG{*=/C +R/ӕ{/Yևc{x+{QXȺO`}>$0,mR>8A'U)aJM+QE[F)تujg|Gw}鱁ɬb&[;_m6 !nUXk1p!C! uغ>gtiB<@F`uq vw[R= b4vfqں '5 +ᢢ@eJ6V #YSCx5k슚K\M26f;%Op%Gܜ{*-Ѧ/#.? ۵,ȘƇ <OMUbϷ/cG~Yrx_뵲":u]8:7RD J[@U_wada3̼7 y S%q7&6mæl+!ƶi+MZYu&ق)c4DucDq]4IjCc7@>^88{X[I+cmv>mgZ+;a:+*Va{m7#;Z~FmГV}/}\ݦu*E7df@v]*db+=R@>}C?O + & E{nfsSKcnttk#qP 㮑fORBTylKݞ국E4CyhmfGjDHd-.MWߍLrh*Q=eH<\s<<+-JuSߣE +؂GJ"^ПRdJx$@XJ2! I#;gsvZPnC8FL%S\ +*g( /D ֐BE0F-TKUe-ʛ8 u|QIBvN.=Ȓ87L{̙3gN>^;G1f=L3Exg+A(_ +Q}Q +(ɟhA^腸g+n_t@Xe>#Fb4iFn=ޜ ^N^)QM7GWUɩ͗uWI(bV#^9 Γ[9w#TG cd"ʏV"{5}?>Lrn;UH I d0 2M͡ ;Hj8XaU|w|;#~ߔf,D2;e2.O `3. D6[C(k:"Bz(ԖHCq;k(i5\Kycʄl5!W/%2ō[Qt_)[n`xop$Q,\GB6CL`ֳp< {j=vW%g`tv=qPsg*鳐6RT;>f^z>.0F_أVTz=a6\R& +kѳ/.<&@x*w@3͝ }0†%C̀9\bG[gZK@ڄNW`1sӕ3siBRnmF${\b%t-Kh fiɒzkݑP *l*8@䯫`5Y~S6T>2:x:H>ӟ)[ c˵Ke_|$6RF R&dg"qre +HJ!ApD$ȉC.R'hAB!Ȑ?F1~5$$!9L=v&“a2p^_+.g <[m>RʩS|pR]JM&Uy(Y>P'y &UkᘒR3Vf*_A,Ssnn{bEh&?J ЬBJQ #t`$¡VOwlKDrrʶ$J܂ %TVU4/Jeծ.EϼC5WԹ`0(ߴu{PjYȋG@ys_>ALkW|k_ZR|o"zq,ncl ':l668t0Wz 7#PKVX֊k+)-v=35M@ϦT'b7EԎ @q7 I1R$ ) %8(n<*$xXH 5P'D첹h)lu:Wc\VWʼnפM!jeg˳K]IFjxƔƽ}zԏ?Qpa^.],YЃmO""ZHN* \ʰnPx7T +S Hɳ0 O|?ܼ}۽NK??k{Xz;_;7gxf܍Yu51Ud\r9YH9,.'|ǝrR^| ݃ ˑyz~ HH0)A[$ZBB-BPh.D=]!hŎda{̸3he\ԧa gZͺW )3.;]"vhn7YX]}ZQ_qh_WqTP_WIT aaI:rrNjO'Fm 8|E ~7[&B{Un7e"Tn _^_\t*yձ9gm駜 ϽlڧӿBV؁dw:>^rۜ=gK2™EfaHrlkگ;E(30'܆ @;w TRdY2'G<'@?IhE&: Gˆu<̇`9᰽er B2@ `E.$ uѦ(\˜F%YŚ%EէӣZ=סZSD{>4㊠'tWUJ[*iR d*FծXM_5.rETԀF&Ɗ.sZ%t߬KO}}: +U/CތM:>tY-0Kha, k{C>:E۲-+?~APrk{{_濩8>!(3ݚnW1aja8^(qxXdA xpv6#Րa6[,_ ]r]`nYVC5)bDp=ѳTtڵu5( PPV$DC:hlﵳ~{}~>eQY 'XmlUbyN|:cTL'W@uŊ +R]1^AUlUTf(Ѯ(7(EiIFޚHM_)(uFhvx%?\d dց:TΧ4󨧷TF8Њ#SQ"a7h諲~8tmY=x 9xx^a[*tWtl)y}L_t}G٬gOsRvVjqkӧǔY@n,5.).C3-pʊu܍Yf<[̩-b)Q̱m)^D%kJȚ%lIID6|ҙ?O5OC#KD~>P5W6;e\6egmلؓlxrgr(73%[X\Ʊ,r>Sfi~m.I]0dU|I2cW7R3)Ԁk`?qws?HifLblƼa?y3#W F2a pL;b~s!\oGAQn1+;p\d.b' B?W$?5#Gt[~ ݳw0gVB2.tž-'H&?/x2rA53Og/ݥa j^pdRRV-0ϊσe^Z-0aI ,K>A*99ƫ} o &3jt-u E ƫ$̦q5L@O/Y"iV aWy{^>}x4O <[jkn]vsB:E1<_)RߋDd,qK2aEKe+pY"qgsi8CѴ#noֱdr`$ML4?6e`%&wyiIY5t2옯v)c;ST#Kl;:"%cz6ޡd4{/E`eQw?MS\7-R !=M)IvFlfc9,A1_G @by 3sɵ抹u\knGnO.+G.G:]wM>`@dͺis}~`?J\ee8'Y WLuEo" *C $c߭zU\&RR.gz*z޴__ژTWJҾJL{V9{l'S)Eia-өEk> Or6}챿[4X_^ +endstream +endobj +2972 0 obj +<< +/Filter /FlateDecode +/Length 71525 +/Length1 143232 +>> +stream +x}@mW:P<)z' r4bo+XјX&рAFIkLLz(vbA%1Ŗ(ށ'o3w73o޼C@@;v5-.@ G|> @_jD{m@r&x!U f ^@>d]r0yjafOO&P0ձ4`(!@G Hk _M0Rd@н v2rĘg8Jt +᠃|hc` 8a$Ob`8 )!ca1<` & +<7]Ё?(-x{{tgRra0 @CFsȍG߁?Q5> T)v |SCnu3X%rZ^Q?Ÿu A. 1F6%[So@ =v@ 3a(L1&"0zAb' ` `5` tPe)̈́iL 0^0zB? =XcJvdF#Ra07a +(#z@* 6La1| %\͘\3凋nߖ{5MD߸{H7w#ܽ_yMkƾxxxJWkO98Oqz*o7>~OQ Qs9P ?#7qA?0"T`D72䓽7ݘ'4 yRcܘcreƮ(ӦqT0fMeGFQ6iFa5IM4~F@AVU#RX"eB)IR@Tا13TF1@@@ chCi`'JA*#Q?Xzv~@H2Q_Xz(8p ) R@*R@&Rɧa*r@`ArDr H ;!%0)a8_S0Rm #;((#;F؈QLJxHY_9lge䈲e\]: Ⅲmm #mE6ND9"D[#Lxx!BKlHrQ&&e2BF"-!r]%0qT@_TèQQ((M2J%b(d$HkU$Hk5 +H]k1*+yBXF+1A7+5nVe\^gOB`MJ:+hg5ٚY/s@5Uk5Vƌ/kwQ1c0}}ӳҬ ΕGAuhF'u} "&Y]N^$.INRC뜼"KHᾐ!8D l s6 pe +2 d @ + @  TܹO!wwxqq s@ >/z/  __>{{ {{F@wA'4'!! Mp.; +0C4HH6Cs6D@wHh݆ЊZ@4;DA,;8wh-X5w b%KMD&C[&$@wZCw^v H h:s7 :sprssסCgHCHCWH~nЋ Co7}e +=R_'~^]0}`w `tB:w`w +wp + ׸+0FpW`@:.P]a0 X2 q%xs5>&p]Q& /0I/: dglp?o` +#L܏0 s?u2`:w2!awREȂY0fs?Txޅ90 pa.=@=̀<̄ 0 s=X]ٰ;s`wra1wއ%yr`.,A徃,|;XX3sg`X3lNj1lN'; k`3w +>) +S9r  +X ۸X_r%J +;oaEܷ vqf͝-; _^$lI(I(7 q5 l#7Nr'q'`n8=}/>;;w 3Qa8#p; +p+=wQ8b8?rG+ W %%0+8 W#pq;} g:wA)wC)5\!nr} 6w~A rg;Ar2x;!~2n?6\rnDn!#?;H탻H? B.x\r )=`CJn7H)]x3x7(@V04!K :}|ȧ|Mgw~P3_ͿGZikgڲu,X[[[XZ7[n8wꍿlƻoi}{s惛/lͿoQoiz}뭭aoA@AdAQG +&-P8pJa~W +)fFnmOle;,v]]cFCO>}Gۋ~w2;H-Z[d-Ut®zt ++iWY=v{w_w{k_}mu7rߤ}ۿJwg?p'쟻?XhwcL80X} :HTwp,;8}hɡ]:xّG6 {/.hѱG9zwu;xÏ=>DOt:Ėo +~>)=prə''ߍ?1~|ɱo$+3-VW̽;1\6fŶcfL3&oLۘИ1cT1q(t#JtFZu!èQ(mE~-pm!m!nA6/l9rCK"#G$20Q!;ҫYI"~XIć"b#ZDx?z8 +;v*dްa; +öm[QXNX^aâÚè0)tCMw7W?ys)ݺoԶMKbc,ѭZFh,"<94$$(ظQoCCΧ~=oFR*2WD, +" 0j rUV{ZA3R +$S4K2E:XI_m+k| mZ$ Sڊ@W\^V·mtNzBd|p?5kLBdkhJJULpErqVPoOVbF++B_H}ۊTVio$cU z L}ԧ=r$+Zg:zs87H|lK q`Fn@V҄Z| ZfZ _C^ +pE34T +gؙ ZҬ0C!(gf z'[ɴ @&wz'ul%}𕚮u9xj%} xK>( J5ZEqEZ2.yZUa.o%sSZ=)A SsrZtsRs +ܐA*g>J+Z[LSQ@]ν֥ٕEALWT]cYqVg9AVi\^kKw*o +ݓ 0YfVBg +0rz#5%(PshFꭙqnɘb%RqNQy;,ϩx<ՠ +5ʴ<( J]^uK.7 +9[Lj GВ8$6(5#7rK.F ++(QP5шg +?n8܊ ʊxN7"UrR,00Y)_*Sk/Pp *͡}[㹤KMb}lu߂ڸd&X3%`[uH:'pSK%"ZXh]Ij/33SқZ-A0+JgKdG/5:f7^,/d&u{,T/׬bwK6cd:G+e)N8Gt8I(KFBȗZ2\O +i4 +{Nȏ'dPKyi +i|6nEL[EJ 'm-m@` L" \27,Z{L!3y\b9Ju"ܟdyȱězHc3ڌ~"dhE%& -įGJӉ*42c3pA`XXK8FLA4GtR,w/J̒~ߥQtK.߸q%s -{˧ɋEkŧJwK%_UTCX=u +455m8t <bx6起:hêW;굯'Q?O3^j} +iRVCCC!Ͱ2N~a2Gmwrt(;<_ Ai|$4k:&@VF%|6mݺ+M{5a]+kد-19߃fU[̌lޘ=;Z8ZR-׶-+FLo'?+OǝJʑ0%aJ9s^j1/] m6uCkkvTѶhZwhK;:&uLvvtubbr*t$}8L3=js=ν<Ɇ:bFJK0zSmն=2Ɏj~K0RR>{vϷc{ضJl`ߠ}<C0 #yz;jaQ(^ }%ݯy'>bK02`g6c|*0#_ ǿ<܄O 7W7T_xkO̷cR7&x{#d wFk%Ƙ O~tV?3L)WZivz +;DάY3jgee}l/̾0gpoX}'>YseOGȋ[?/up65~5NX[d>]v,i_ q.Uje-|VNcZށ :q|X6}ˎ5NfΧ ?=M??Wڸqk uZwjZ%Na_ |_/nasS9wKo/c[((QvmS/n__ջ;z=N}$vu|*g=&W8xCkscq8nw]`QgAy:3&#a61q^7P0h]!JT:a*r*V;}tHҡ?._^7:jO{(!m^#h{AM4=a?=T2M%^h+:}WB}B>yQ'`W@>\0%kbȧC>up9['0b7Rayd/E7;ȍ`pM/3/#? ^iqG@_,\g}/ɼ\SZuYUDSgcw҂jr +g/߫U_ 2wMv::Y+:ΧYݳ^h99g !@#UU̮2)^~Sŕ5ŝO5ϋB=]8g{Ѳ&(q**8+5{y+vGZShGb! ?ڗׂ:HBtF7Oɯ:QE|/5Щ]5ӫ)ZE-p99{|^U}-_Kצ|-\PoI#^7g'':5+Ny<`#=\gvSgg.OuꞢG?.RO^/Ne;ww/vMOƾkkྲྀr)=᧖_=~P3W0|vV[jA{kFN){vu՗]g=M\{#DZa&|TfcQ~f{V^m9NivcPyՔWMF.{H<'f^ͳ S>;N7τَ 6{LMc]Ƌeִy9h<-#gnD?0Cuvl>~ZsL7朞XK^ 3a#iER@$%;1Hԉdb;=i QHd?BGa0p Z-AI1#;jq%**ZQE\URRzj҂ۛчB73b<ϸy{yի/-ܕ&Yi2RfedYj*6]sMihO22d0奡fshhH0I@OT/3/E}쏽&dٗ'&7ȭ{Qo@d=c& !B55V5=$L2`hS- { |5T)M7T7J##KKJC}}ar_04npESFNC#4|5 kghhϟa4j7t=tu5DDZkXB֝{ΰo25}ꜭ+?E!dnYE+'ovzzw#;Q}zkL0+Mbв,hGKl'-WMu"qH$ @sZa*Oq>!AVx*+D\BB%r["QWd<]?LQ0=v&$hA/HHŬS)DG8ѱ1AA1ɦS`\ '%[""H;g6j..k +πc,z*:[&SKJN!' \S&:̕^@1+b7zͱ3QhDL F4@H"eMjT(V&9$XoP0 ,<zi R7>"D*bܢM\.Gr@.{gӴ[Tj{ +:ѥyT)Plf  afrZQSSo_X48{.w˾b/\<:S4^Ymb9nu.)(œ$*e.!F&e֜];Yv{ D-X}㲦5kEE E$")-3o !3acTaz[12%~Q\Ҹ+>%o6cB]T>>@,{/pl@,{B/ȮpخPFFKX4 ËiuwQ9>|a;lu\ 'V˞aͭa‰B ]ۿdC|n1yZʜ96{ +3{zDp D"@_ }=R3mRӴU*Ѐk +8"}6l|k"#c?M|ďWL^5z EnGWlL(Y`5ԁ + C=LfըDVRάP=Nku'wILL򕇀-e%'v"w0 APhW;l"Oоe"wޱ>;_F4 4hy6{}Gm-x[lnG>DPwQ %zwh?f7k2074OK1ɐ"@EH͟}F0yR8iъ+Hjև.#r0ho[ĸ:&H<} +3b]˫+̅pE&bcƢakFK$$MCXw Ғb1$aCd +3ad{X+Ev[rIJ )I*þ62mVɭ6 ++][s >QB@$w\*A7 'WJ%Yfq$/-h}M# MpF 7w +Pٸ6,hᒓH3FN 退W?i颇(>3Š$(ŤHip5H HЈ$4E 3D>򍈜]pxgy\JG~ee"&IJtR]8fTXIⰡGo(eٯw?C^=Dg h ;-`22{]7ңDvCsRxlj,ȕJ$䒤`\ 1:W1XR5/&h +4*"?+ܲ]Il'OwCϜq33 oX"uUKRxrVM_"l=^N 4=oheɘ\F(BJR+"*eg} CP+Q̈_ ^|Xn T{Nyp&U$ߧ}tJ7[]^6Mre26wMD^Z/EP.RJ +d\ 0۳:m"թԹ2JiP֛DӾI4Ա6]Uo]w+"{Y[ v ϶VPLϏ@,aҾw_ Z$^vNs=,˒ZxdD{PBJ`&% + +ౖ -W=ȤLш9!/Ń?|R)̊A-[ܖyA-[Ex>*|y@TQ(']UF1+w*JHI*<ҒQ}9̛k^T f20jq~[Jz_8J\>Z"FyihX%G_"q +)BCoڊMtC؀M#O-[F]߰Jt22?K(Q m6YՌfC]B򍪱byYv)ky C%j4. T{Â\V\B`)b.|ןZwmYz !ϻA=3 +/z#N@7F()9\d .'oT98H 2e˨%'4f2=;b+ ]!)3`E. 4}AguD^}792he<\'fQT&K&Ĉ/Ծ +b 嬾ǯ_?l^5cNOwiucZh33m*"FН@ f:ۢnbPE-kfS 5+"A޶"rR$fl5XB و0mG$0yR򵊔nrP&+16^Hc0wQKeDEX/>@@ JGh$2Rfp񻭊Sv6my5 iWJ[V֭EVxЇ5`u'42F+C恲J&rlfIi$bslZ\}0oy)EX{1%]̽ YWpMe?7 iBj~1>}҂ +-R$QR#Ѩd.2$. B"Tl߹Tl 08B= +sI.b^NL_!#j{RIJƋZ( +2YOK\"m{!0+CZ"`ha魒Ie\%X,Uehh،g♴LI}5:±e@e3RxI;؊*ZB(v4W0YvD׆ 2҂EF@2 +$*N=> 5HON,c;@r&r@vO"PcUB-jXX8ނ !2Z +jp^ebާޥM>5;Ҟ a _[ݻϠ>oP\6WUv0 niT}@K A#"I$@$!1I @ňbRf_FO 5h$_!PB֗]~eWC)O_vE}U}Q/Ի +~P* 1,4PN%2{xnY*YLJwfm.6W~z?0wjp')Iҥc2еGo/> zޗr%@ @p%E"]3Bd L^GMvsK~L^=wx5gf?^z$͘W ?˫`J) .z9y߾Sh? ek[&x):EkQ=v`%29&(q@<0u*[EJ[8ϼ $}w܇}i5x(ؐ|O2(q0 hh%0^:{`N +pTڬ o^/ήmZζG3x}۳f}oӧ>s*-|&Ϣ`g[Yue3.HGIXWNS.xd\/bxdMNǃƱR]~GUTaSXh: V)3"pyב"$2}ʠ u& J0 A"HҰ$YjzR%5jZUT:8jNJkBr5}pt:4zL={cSRN2eTU2e2X~MR\PP< fR]Ϟ0>pluvA+?)C +d֡*3.ΛW c5Iupxlɭ i/>ɪ46鎧mtp:'gج y~5|[~[supb/?+|cDQgh *LۣVHŨ #36aAf:8Oߌxܜ. aP +7܃)AtRvBa׌P./IRI*O.Nȿ>[j+* S(&|^%on,{)_~.9p-^ykz}x6@.zjNܵ^;ؼ;,ZD$V~D^_*krڊl p,f/ `OHfJ~Bu&XRJf[*'DzM!v1n}\x`.cϞ·x(۠ ԏ!etk&%6r6h߸9?@KWh!ʾBBSZ AzVyIFz~P`9,Id +'R{'AϵRVC +p؀_V^Z2Yky%Ý]}P~r,^{\3F~+2+o؎E +x򈸤EqW4FBJW+BIB+Tj +_?c 7z67D +z<'[`))(PlUN)#T&a+aI ++qMrGFiїZ_j[k5pZܢ95D^ouQ{-0'¬d[gglßfwsI^~zt~F<#FaGnuߥՀ!U +DzL8x g,r`7H"+*LʱW`p-qcd3.H$sgeԓ5l6<x,X9WbJH!KAa?o뉠!mh1Nu*H)dCVA*5 D8ax a + +#*kv3Lv-0̷oiwd=hka?3^ٌ={*"Vl>ʯ +":PPT( !~a\HX6WhLV(H XgK10kiu]:N[lYMkq +yT}ՕeGQ{cÌRdDM)VŲŅ2(OsPӯ|G_&Xۃz cX]lyl0&bu-1bņbb|y9i)rliuz4|J-0xxhSR[$ B\)@+ɊQhD_ +eVC]`VB( ]k׬5smD5Fo Fam{B=<о,E=P/*g#hP ?_ +ηOr ?[M3Aoi%P8²C4P,yȬ~㄁'Ȁ`O>& RP5 V7-:F5 +RSXRA,RGvRl)ТlPpң`+E^AHD!Lh 䪀qVZDv^2^%Pmm0 ^}#^a2` NQ|`vWݔu ڦ#W<_xs֯y;@GEBr%)Q5 J ?4GJ((a tRJ^DґHKn L ՔH0 F7 \h]5 D +b.XjY0;>a~];sld]Sg-90ڈv*mry98I<eaXfˇTÉRܒW950#h6Vȵۦd諣3s]'8av2؁ﱿM.sm`%JXذ2]!d_TU%^Hp~Š&=-Э5!2=~&!d`P9*ϗr(/p>ݛRD=^^/?} +vW*RUP(,wn潡 xT >j^ӽ҄p8)KqY=L:CʌHyH&.r7˝bV#e@Lΰ/Wpy&WUk_ftXaO|Q1&?(p G 7B~h(]Ldߴi>9D@H:uJhMG-ў(mnDOEߌJ^hp7x$zvX +YVaaMZÂ0]ʴ$wֳW, W#Wo[oD~4Lޔ[6GvG^:3f;,/Q^yH8UTd=0 1Q]BaT5ºXHV$x2RVAN|6 1Awô% =06pX6” *NְO,0kVr,/ }s `^Jzi(G3tB?Z$"mXVV7!;l)>ɮ_v Ⱦ5('@kW5sO{[EN'QV9,cJrD ++a`':OW2 X;+#g)N'=:X< +C2<· poVJ<^+A•aIUzWCCC0҅PuגM\bKftʌf9u>8fp}w7TW$^_@ot=#5]zE?șj4#ãld侁g3H`)b^_Oa/Gq8Ӵ/d{W#~Gp+P!N).+ a\<V( !a*5v*G1VQqE}CR{γ`ot7[MggOӧe:E,`O|0+p {HҳS}'FZ}1hBȑ!?\Β2Kz]Gnf(t;>EHtFm}o[ @K6y#W#]dD*4!2 +LB50F 0XW7u}*<>)BC6BHP搆]$K ԋ +RjpG{ Z[]S[|fw5!8N +>٫M/q,wF̾E0/wW/mU­X;aصNQR>WR:ƒT3ЂA""#W'E"P.жZ" ZVYҴ"`I<Id lESѺ(!F4j"<-n?w\qD>{A^T&2/fq7H`[/`~}mz"exH)/RQb#۽{3?P9ہ?Ͼw+#44E&F![wtqB+Ƞr"!S)aEÚ"d;־pPhqZUSBK񄏊ē{saQ!P/\4ӑdwJ컴7 YIG:vAo>#|?%2W=']sTP1X&ҸO) +V!UVف"95ULl|3gٰ \g RTL7R仑L±F +>SI4)$ɇ|~Y?P- Šۃ>^R9mjc>at>ܗagr_S%rC'TMTq+:Xg= ԤOyrW4Mxcpd9N:6]yx̅_[v\]kپmx:%3(9ЄIӚ8yD~L!#( +/Dk,2:"*ss!4E6"0 pZŴKDjJtA" ^_[AtUJ—7րY$Ɖ֬%m1%^[Ubݷut_rߺLTzޖe[I3qo'");ML pBH8Q}QVG='3.h[kT`28 +ҺEo(XѺPl>lj|>Z'+/Hű.ZϼšeC; ,E~H]ٷs]0ݖs1FvƎ-sfv +M;nQ_[Ds19ClXq!^/q l © N}K4,A}qcνt.cx]}^\rvv:ɝt-M-6d}c M%t8O{O(Ur/KщP%@4ZbS1:{ӇO̼lQ~qq,F`t%P{)Y["$fP깮u/;,{/,jvֹso?;Yֳ E̮_۽5{--D~Pq`=@5Qd#TPGDIY:PH~EY(e \@}t%PtI]\k>,vR=,/׳neo.8ڸ.2R=}Q_'vr!TM}aOaR-LEPc\Z*G +Vi\=! +QTzX +lUn)'Pt] D+^(qI!G=8 +# +hL ;L؞k%[ qIrdv'>`_kŠZs*"Kw84NFV"Sp6)MSٚ`I 7$yD|4'q0B3 pRfa !!C!lA]DER_tA(^f9.гciN8P5u reluNn='c<'D&{?}ԍ w*JIȋt Ci$ݧtQU Vz2T@W +N){ܫq6ހ@_?'ޛǢ޻&M@ +2{]49ꓙ<w,Ú;:$^Ȯ[6Qܼu\:7_I?JJRGD\B`^jQؠlUz7E䉽 ! P1QB}^Xi)FZ=Yn#{/ep|b?&̰ݙLOSOlSW˿[_'ZMp'@dÉXyA+XIN(R sU?ĭ";;>0lyx`/I6-ditya=]G|G Qge_Б(~gzAIw8&nTsj} + +n*zݧ||`ux9&TWJ-QD<4*D/B\$db/=gs9u=o/6ڻ2}(w`׸̳ >7,ƙBB"lhJ"8{"?D H;涬y/gs dp>Ca5- 0u|7ıţ7}XCS!wxX"^.UEnW^%#UXA=$[m~+չC^g3a"3ddo׏fUyo,bZ&G+K1'ؤ3iR)GѺ(գ5 +=(n/x&{I$AN5jD4v G%Ry)`[~U +u-ىV{){~u6L׳ 6;ގYOH@6>}S"Ùx'W'w8m5޷\ɒ`C] IƅBU ]cg/FqçcEk1y9]NWaKi#˟|]ߜ̦;؄0xK?h0?^MJ[M(B>Y'D6oGT"TjB0,wˆ)oeNZ%dQڐlgn=`o"m/dwo3`8NeC"h!PWrEW+#W}HIRdNU$(Eg:t߆BYo@R3Wu]v–l~|߽#gter00?߭$r}$pFA=4Z9*.)$'>W| {IQ`C `{ *xHS\J FeHd07ˡ7;v> + 'Z$7Fɞك5Ixn7 +#5?i?C Ls/:D'ehQàϓ L +4W4)4ԹSR%]O讈PIpbl;l$vdәR&ʌkǐ"hCǞ頡A U50 JjnK8}9B^Zj u`9FQ\E!BHOJ%TB+K׵gIP yE)#-Ct_\R~Pf0i h+^RHn9E%e-5qx<;͠HuV /Pѝa:={9Vk3i-e[5l=/nؓoêzPiTCsڼg$8c$ޣ; *c˂Cgў92~lDn]Ɉ3>G&qI®EiD MQ4>Oԃt\:}9gCUz0/,GWqP hDX" 4kq\z2Eu30W-)[GedÛ;X{=ёیeB6y+%;HSLOhh~W+Gu^Hy^UzxAR"CuZ)cK_d%?:^C [%س"Ԓoq"n~%2$Qאm $  /$;9vb_A,%~]Wcm30jIM~X\*~"cc΍+Vƍ1h5d6:Vgiv@Wm@;֖2?ƖoCc\y#]PDѫZxŏPGmW *!Oz1VλܛF/pZ8! +A#$0Ҁ8:z1MX8,.U~ө Q~YE(0{E>X)SB.J_˓-I>s QE{nTR ww,H}_!b%<-䣯fr{Ky}24=p7$SŀLi4hR@"wQZ""T 2Ǜ2pu +Ȋ"GTsc_9,4VMd]uEd-";5bFHl 10cz?;DI sYI4xԧ9ML0a]y$I^AAcP`hM +{&IQg#&Ќvg–(p2 +yNEĜ߈>ŇZXs9s-gUZHXYbΝsjTw93MG3n 'E h#kGB99VY[ZM s!BS:`@snJ ӕDGD_EW$Pu\=<g>^BHyqwr{1.&NWs#I:;װ$?Fj ru>NO{[ֳv΁\daE4SJ+|a>"~Gu(??>eq(Υ0noNT6dҔt\–xm^‡g᙭^%l`*J&D7LTY*VK+dnAtYQR|^Dn?{)Α,est}{ jOKs}w+ +q Ai"@Pę+s*<ǵEX.1:7|I)mʐBĠOV?p0(~SLR#vX=vpA\LjDzݣ_gb6=0,Zox/:E{]I{}8>B'd+]w־,f'M&{}P ?ٝ ui9jUٝh[߅n۶M|~]IS -^ls65-c·9QX,ȟAQ> JsVfE!BS +n_Ǎ~*qÁ{S +Y:[]5cK+,8j?v"Ũ%;3DyV35 U"(COk`'OPd bt^XO>jY~`rⲲ"0H예iRPz@tuU/l1ХPH!&)>F2)wBpT[MgyNp+ 7uw~{ [`ノ6AGΌ!eج1Os3b}!] +I$^D*D:{ 9*8'?%jje*^qX!F7a+)h{f2ț٩. 8R8,OJsT\hEDskֺ%@Iޯ@1 p nu6߇}.=96¬p`B×Cf~gdJ# (S1^. +;{JY MaJHš1ǖ諑8śj-ոmrCx,C .@UA_S-'>s "" S>{}n{Ծ4M2`n+Gsq _>rk5lQ4,7ɯ0բ)p'䧐$s\VP9~m{afrz2 /UO54 *'MV +έEzE/U(~ݏx!%vvá?'䩍oü=2'չOy0^i?ݵz=kQm瓉X52A0Cį5W5*x0 zD`]&ŖTTlvHy/I~Qos޸w\mv[+^yNXFvXB/;_i? OOE"f7uC'/t_al#GiczbytӘDA+(0WIUe5eee N仚,? #: A \22*0Rv9BBJhK#Wzܨ1=7cn#;ŎU5q;NpNgvv϶}ӧOvKJ7G!YF@q2#3D?v.~=w!OCz=BB <"*Z+w %=.]=Hӵ ?XYAf߳3ls&{P̀}hP;i2fỊ7Dyfz@;8u.|3)ܑӲoЃ7hȧXfdCʾL}~|jc>raص+Mr8ԯ7ʑ&:j nj h[&BH9{!S1ðDdq1wWKR$> O,8/X("}+ 'nc׼^hk۽2{ a7,}*\_6d9tE+ֺ3,ErxLze@N!Fi~']BT]+on{ +~mve=؆'3B杹q6p]}tDl 7̻a48J!CIgP6 n@gK +Vs$?{cdzb1čFwx ΃=- s4IC*|!vh-hƳ+#҉ѩ?b/2{5s/F_(nIhXig2D grv?6MDĮ3}28812Rg +Z%5Dzk!:)ki|͐AN6I{u㞼GAbP԰gnmqNٽE?՟0\s`\Î~y㳸fJLx~Ӝzo[*v'ޛ73:]gF"|=7q9aR"~] 4rV`]81(HA7WƿKOPLLl[.]~|pxd{XFrqȥq dwL)'{蹏z>ц:k+>6 Wqf4%yZ.t +N@2>ttuzgYCS9:;w#\sн}P9!nܣ`yxCB[,C4S!<Ћ `+\ sjBU9bMNx5A3=#k";:?WʫW\GV +AAaz ++yBbH.`JdC` plw ''d!(*${co⽠{0}\tp0fE[꘦am{Q79;M I f-RfgF6-$2̭=|MbczL)RNpzLISv)}Ʋ2̳@>@Cޠ@@YA;$m/?PMa[mЖזf-\I@[w7i:mž//'8eO}$MpۓĴ9)/2|urfvxzm^R|<*S;u܉YSAZ!bS Yхu;%SaQ-p^:vUGf'W]Tz؇^^2Uun">ND}lj^2kvO Hx-9  ୏ (#_8GFTNZ,9y +7%ҝ(eܽ[̜=v5>{eQ-6Ǒ,9^q="-hG +Z:(~?xd֤_(V=o{w.÷jmKxH>&,q94!4 )*QhѨA> 'Az|>,$ ̭\/?;aFnvXKX_+`A\}qIV> P"Ȇ(>RV&#=R,x}Vy?E!?kF^GK>` DZ/A'0'h<lPj9HMoN<;As܍O_(&͸J8m^+%(C1RT\R]PR^U +^Ԩ[s 3%?~v c~h0F +6Qt.٭08y1"W-Jp'8{, AH})/I_FEݪ,HPR}>U +FLy /( mR ׅh+HډͺwKNlx-l^FsK >IK+ZMD|3h8¤Q3/?qȾ!#H]dydGDr^89G+7r<2GxYP.E1:;jzRTTRAMϺlq2WZ|$(ΖSPmzqgY[b'oWuv?G(av]2U6+ΒY4ν +suYݎ$tpgg(6 5Nf0~#śiNo'[C" +ٙi|]ƞ+X +i$x[ѐsZld96er\R)┥ +$U)4*DTU^E& ;[~kRXS&@VS>e\[\O:o~iSnF9 9Cv7݊؂;UWEt_*qp*FcX3F{=s{h@or+TmY*2032̬J!iVaEXb:4rD[KfwRleZ\JS {gYOJo(yTvZ:3_zp +x]~ >c|N]2׈J qZ B> h4tL L٤/9(w.r8`) 8IK@<~+ak;1c&zC| ,*$,.Fdm+nQhu;Y^$qV(޾ro1|ps=9qQEFRF]z)XW￟LO.kgЊ]\} MPCT^]$HΒ1)&\IR&Z/w&.qg1{,eZT YZmyVmb_BoUhu +RIy䜻D/NE>ad|f>3wnq2ϦDΓamKUW$ +5)3dJSVtVʶ/"dk5Zk#mD.1.b&>#Y +QLd\B!M1: dYM.-'Hޓj闕KJc -id:v^R:"',^B? uEpǷS؜ŢTTR?I0'䨘hRpAN,)R r +]~Ԯ_EZiICe rEeXr9 nå wǬ{EH_'aВD՟ jP j֗\*-=/{!‚ê* +<;1Q 0Z.zV3eF|MҟlsIܹGHoUb`h, odPV(o$ف6dHIjAm֩,\o$ͼ=F,llcӻ=lB;+DHnY\:E'77˦RKj LRKyvTȞ!Qd ҥ "F"N}zFTkb\H:Aӈ:!VŅ|*n«}P#Iĵ^ۨ%l'ވ+-e[pȔ)--اYd L07kH;OhaZZ0֪b }: غIՒQ`p??PsK<~DZ+ѽX{\Kg: +C]ZY6ԩ֩{g9$Ld%Qqu:֕,$TU@|d"Fb"]0P+8.2QJ[_'C-` Ԓ~WLMČv9 F.oL~lqZkmfbVÉ6^h NsNOPZGN%f#f;ef2F%Fc(Z-!K=%UXb6&-Ofk +aIwJHNXѢeerV װn {fM5`Du} ..e{ ő(]KN˧OeePAbHϯ%ryVbX]{Bͬ{$^& U1_ OljNNp׊ntpU` *RoB'u֤ŬWݮɲBƸ3k1Y|:Db]2;Ve1bH>I*˸ I+=WH v^FBofL'Ѥ.xF{'["GB[#REfݹuW{^(PӋa-*+m^!s`aE76Ckj!mPefo&Ht5M] P-IW(_/ERYگχ{>:oѣQιs;;g)ku0=7ɩE2Xcl\/5;6uPܢT7/ =KŰVҁN]Ai3[ +2y(_#hF-&n [O|`>+ Іc?Íto_a|F|dlG}U <lplAO_;w0vdcdl⬨A d:K'#ѭ1k8t5:SDE"}l csa*Hm h^PJ'G#weM(&}'ko|ݻwV޳g3c4^ۄ\00Oڅ;D;x]tz) a0UcةtNjIP)mkFO6K0 >QTzfH1 4B0r>6V6x`4.|@^zLHm *F61 Jb"=r2׹D;:l] \>ʎYdtЮ/KHQSe.4i:«"kG3C-'.AVyg{:M4,ݟ0!a^Cf^QK߱x'|vH@: PtXV䶺BFp&AǺJd%v?=\Pܢј6K-pm+*=0<=F=!YjEoWjlf+Ûn%}I +}Ηc[3Pm).]ǛϏ90G7~?wbZ2/%^A.W=70~G+FF xc6ea%a᷿UiژպjX&Y,Tץ,NӸ,Ͱ)7y3~ 8灭{BOz>7/^9<.JR8ckX'fKd =bbޑWin=ѯfn1[;o;+)y-w SmjxNV}^Mb0U:lX-GHwAÅ\HIY1a$,A'ګŲ$puwuujf(ei==hMKa;Xfo/|3a~;Ǐ?:r."i"ha~%$m(\֊ Q02`1 jBOdy=~KoY ;9S":jԾgaqXRBH٬QB[Aj>lE4!dܾ"|.RZl2~]N_74K\&>?]c|pz&;l8lTIvǃ+pN8mO{2Q;\h7VF)CX֊B]ׁnc Aa8l`36%t)a3N ƫתm'D誵D:mF&\UBBnrOsA\ kYí%DvTBd9BGR6YŲ$sĎ;T$2rX$o:,IGNr6̂^dӡgc;/Yw=ТOE8!y2/$B\"f<7,dsؑ^r.own=ֳsa!Ki')*Cj(a7հZ jbt`ºY/tgu*4,YPI2qe/]󒤩rg"!'2Tg.[;qUt;ɫļR=?φ|,/H`c_~Sps0wO#|طo+}**~dIG£l@?"͎V5 A߯!n[ͷ{ J-gy- L,HxOߪk Ws,Rƿu +B@F ݟ` 66q.*4, hlr(ZΪ͖K'|= ILb}ۙv }=K[.O[Llq.}s|z^;Ěuht7~;jxCJ7UUѱ>Ǒ- D\-\wC\((U/rkP@\W6 3s0Y (^6L +f R$xRQP|sWiap=Wz+B"D0bX/ +U,]lS`gP Ժ١Y@ʫvN\I<8'%K O,JWŰİ3p.(D2iNa.}'9_Vgv6x ޛ걿=qMD`ޮ.~jZ0^=VAZJ%'MD~-xOΟOɡGCR=N^#^7T1=Ru&[5 fY0ZmkZ(^#t +X`x231+ yfe,έ]Ѡc [S!H3z;} /9AqeftO7zĪ'`T}Rk[TDQKmr SBf3ڲYi*qW>_QV.8R䑓!@C;(*]c\msAVѨhV(hQ(,KP̛|Wk&᫬溺uu, $)`%wF΃`YbCvwSjfrK# '/HSI-+d*d0f-k[ZFa +f +(^' (}L u!υؓBM,CJ-Ǻ]Vл  Ci"5sGES0bèQ^5Ai+ٟ7j^CVVc0xLf%h&orH؏@U u,ۨ`"jx lT^JbbBH6; ~exŰ԰ A|E eDOuyyWW~#d]P2z=`X2ށXNDh枙nw6/rHLo ȄyQJ[EgQ[.٢#lI?PܢRه87U& +Dp!'ܪf屲=8aW +hRT1J5p8X,:&/+zHT%%؎\;?Q5%C-EA6Af7s ٣?l}{А|l˛Waݿ??u0eu""(gH[ ȌڀTؠ@)ƽ$BH->4:txuKw$}!ئuh>OQ0{! ULGZH?s2~OGHh/aZYgFjOFfHri$j#yT\KԿPͺ:?.5WⰘ >&d#~j9ڄW +B, 2JW:] +QR׏ xUW ,zwɎyϙ@ yAŘ\7"ΌYg=@ ?k l@نiٳdi_dls4hlP mUgBI2QbRAsG]%^ DˊDuݤGvƠ?FMTlՏBs+<8F\>(6 |ZjUAF e3( 7 |r;q_]Z,3dI3qsY/.>8xgZ ,6E& 앿[=;/>ƗXcmsW']Q)]9{ 5z`wpP^^ ȋh +]>H שWe0 +U˹ ^Ѣ j1RnvwŢK9)?(T]WPYRԥ/bIQצ,/_.K{|nO}U{eec#t_gCgd_J#gGφG_]mz1wG*f屪ŝPCrc7_D ,f H-:.Te]29eL&~R,rрJKIq̻:@y_rSD#ؿ>(p/3O;蟅t/w,8v_T\֩jN)87}Z-1~Ͼ҉9}: lFPX5aM^רk :],PHJ9hŌHtaMazG:!;wcȉXL O0>9Lϒ۷obL5hO6 |B#Q-j4;rJr¸d#/_A;,?g8]Z%\#zBEEdՀb'ie9s5x܏ndЯ/wo/ ?~X_)t2%%"a:iul1S{ KB{3πY2L7t%VY%N)S0t9pƅ 7n`v̍wҿb,[V}'Z:EGh}|6Jmݮ/ݸwь{gY؋'?=gӓgëwGQHvŧ'&{Pv?n[|;?#S\?;#_/x$8$S&s46>h&*OTK[h?$!|OAݝ 6mZ9ᕹn#t(v9!%ֹ[7͛X5Vo!ړ[>*B[W'p.*JCșm~_.B1\p2}@W  UYŁ8/diH^L,S`CSg2'gJ6ɫ/Z~}n.;7: +S rеo ^RU/8Xא= OC25ްqK,bV" g &7sȘzSP z` {(ҋĿYrmm᱑ at*>R"?DA]A^\.p`\vT5lX=E-htF0 +KT1sc&ҵ7~t[t` !k{.<%UB[OWQSKА\ZMZk |o_0sW[5Lvak@æF<jׯcqƧKθ_)4_r!8|D'wo}B :)z`g7}|0JG.,\`޻睷?~jf =<4]Sk:$ X_kZ#PHN7NPӜU959rqrJ h ǡ8r0+U_*p^\nh8f&rҳmإd 0)ͭںq.7/: Վla4n=oӦy7]ӣKH݊ Ch7wv11dR P! d#\y2YakD<ĺ.- b^- ӆCK*1>@W& )8JKR*)UtEK9J Ϣ#/ʋEyPܒݘ<CIĮnL; Ue^jN\LSd}/ԴM?|<~d]0In>H'AO3[i3Y4v#z ^r|;G=u2qE}Q; ܹ+;"Jz, 0"E*"nF2MK8r'a6jCn.4 ov .Rr@ͤx+8;@6`7(n/yyUFl4By\(Kh:4X\䀉ivaabU,)]nIrgeRv`*LYz'獰i'u~R!ڗj9S`t76jj־yvVP;,ȚN>O Ol> +ÝյNxwӛo榋\d/oPr[ti_A#tZƾHY^UԸkaym:->ς\LQ.51Im 5nްfq۠D/X"')1Kr')VtޣwO55Şhx饆^zI꜌'^7<߸) |=O)hb1P#h" s->7{NA"c=" BߢIq 0_rܚZ 1|PWgrE$=G]R/CNӯ/|=Z?os98f5 \/^(RM/AÅ?ՙTf+'kbSQx H8M $:y _)\1ˣ֓^8&!??vUlJ[c6w-qCKգ"6J ЭR(qh隟}un''Kgc3oR/2i.'ysŦ /z}wѻ^ RFl_d۶%KNms_/Hl@oyTek +u>wN~+Π3ȭkd]k}nnj^Fa5I +h'jҘ =Ok2J fT}RvHv+KSsd 0΅hw렆d[I"R=_wXѱa/~= |ʔ?l< zm) m[[2]˷ ŸB ,L'P.ɅPnmn}nߩ;Iyx C H@0T5@rfr[wY^r$M\ŀ?ISJLK`vc_u^\?BP΃MMюE;w.Z{7\RKy9Y #`~|cѕ奋Kt'LxHSy52/ٶ!g*rbDFZAs=dz$"AbeaC`p$}UBi "#L'!AGRzi6#99=3uD,q 2~s7e Jqd$^ZiA+ZScty+ta`DF^LG3=hv+pdl{/%%{<~ +B$;qN_dDp+@JQ +lϧcB"]ڽwvEȁȓOD"O<8C yia`!k8{ߏpٳ ? *9>o[\:|2BZ_'}F_O .( ByB`}9<(+X\gLs,vp_Qd>!J@ghJUݻbdRVYy>9znB7y=N!S)܋fz}^V3{~E:u +;#xU uTX,@$r^ WUjZbLFD~YY6(MNO.ٟ +Uwy%RvOV*ɌAښQyyɺ<>}|;/T6DmP;>Iz]Ԉ<ڠROW[#rl8:7gcIOI43ǫ5~ E|U0> +pq1.׉r<T_nj(!:7Wu"7+%Kj2=#Vj4 hdA^-5VO٬L[cD m@8Æ2t\a IpbF[.P}O7Ë mkaLe"t2xeѣK_>hޯRp=gғ.~:6(oQeZL6 +hJe@K{ _&)=ٜm.7cX5wBeujZ`&_5ߙ}}WNQFJT3%w&lZ8)6(ccD7q?xOu7֫"rnm Bu{7̝ݺi֜ܣy["sE2qE3UM6='(s$f3r侵xt/h&V?Bg^҇)N.LW_s {CH~+lV|HgZ>tv'&>/֋_dCHlq-}l/o/cr>O|- W[Ò5A@KMt;=~NgBid_>9#xƟ~/>?]j 'tI)tmOu\^g*;3-g-vg~Κ7~/̯YUhvt8Jw C(8ܢvyޖĀaH}W:U0b6#8%t+C>C9J;O`Dt$ihu/[_O{i-ɎH#s4$xRцl0yzFSAr}ŪGBAr9 &4X +@C5N"'fb"&cmSE_ۿo 6U뒺b%fX,BfZreFa2dch?; +zgh/iT='r5Ȇ]x +'_˗Z0egyXC95=K+c~}^P-FZ6Vx$ѭ. +χ"(0B:v<ֹr* ( ,$v-BQU*NHY@/dW.{%%FKUL_Q gDUF% OC!?0oy֬s3Ե܉mMBCWGDx +;ګ>~f̞֘1TZ^ȍ*2toBۚ$u=m|.S +/P6E2[qS"Y>ȀA $+&΁Q +.|![yo]Q(Hb/ B0$TWYO/)344ݗ[j2q֫=31y4m{[VL{^1`t%Oʡa,1Uג>w^4緿sq.ސ55#KHN0m<&=(O%kyCrB@>ƣ(8D̡,ρ_e^ǛV.^kS!}g}ʒSk>Jeqjv+$YQJf|g(HҗȮa鐖7E+g%H'u_+g!Rg#_?O\Ł + +?mI&LJs&FP3O>׿>_ͤn992_}yx˫͈zт44Ć=ayÆ֭}8،vMrX\"N31,*ֻmn3^Cn"u.%},K ;nWN:pԩҠMdő;|ȟ~?3cR2vd|tzu~e؇JV3V+ fCuiAHN^{&9;;K8UpMTc){=,Bo6/;#u)*%`<$#xyA@ׯUWhѪ`Е -B&s)͸/jڊhL"ڋBPUz4=VReBkUM\] +$eKBSh!r +R09"F2{'oO<3flF㊋6iFtkv|8ߥ1=밸>c#p 3I1u[zNbmT 7Ncruuj(0O)zU19fJ+? 3T{AصMcĴvμZe(•޼~8?ȗ.2rsZ^b/0M^RckUإMR(IlJq$@W2o^4BDEJ68a%ίx7@4}| h(sȁ +a]D%Cyp(2%_F# +rBa`@Wח%bkk0@c1Tu̱JB,ȁacҰ J H2ƅB;?IRΉͤæ]~ cg'Ghdٸ{yލ> 'V6{庘6(OA&!]=^ARp35KZ<אx乣7ʧ?qt9AGC·}'&C?N{}7zz`MJŎ G(.2yl+jrb^ymX}>d8U64DQ@ttΑVPZoɈGbHx ^o \0dM.~ IMX,ĔE?\BX*Jw\dmPzilnr 7 +堘BkxlGY$RF[=G4nP?IW +N)XNt̫Ϭt 2suZw4M/GZ)%V&:ܬJ)uJw+c5HF$uƲPB19QTS'JuPZ9;HdUF R9}OY/ح>Ae[2dR3zD} +FE߀l"z+liucOV0Y-O 2}߀߈D^*TNfjqOEW6ˆEY+rx^´pX'Efr]tf !%gNX:|vta N.W(^ >%eʴ,3ve)^u$IHKФ L^~/M9fzл=m{oDnBߨJJ'+'3$?hQ*E;,ԓW 8:fBZ]&[Dt>3b)' I]t㴍.6@b JL2aȉ!,fpbY fՔ(rV'~>s +J|)}l{=(&WVLrN4=֝EaU:/3+ԦYۡ +ZߔϥMfeV~Bn"cEְͥk6φ ˆ@6[]ևz/Lc'b'a&5U;:H7]-2._ jșݧ?|~̟hlGV7;ʐEӣ#nեHJz'3tۛ_>q'G +9aI!Tڬ +cFHǧفc1 {ǻ~zE01KBٮEL'I .˪M,TJ\OJ0%GN{Lޝ'[pv,C{)Exul$LB dO D땾֫A[W5~$y&ZףtfONRm5 GBj|ط‡+ӄsV"TWb)`XBM\j-I'-Z, }`L m]:ݙTF_?6>1X4Mdܹѩdx?F'=K?&EUQ?>Oσ*'2tH[_~ } |>DǎBhu!(P`cH,>^y_հd1ʺ똶X]u)4w#?^I;ePDX$:Ʒ$%ȋ?.*m"wz[lr$ՄD7IJQ&M4zHa$FQme Ctx{08.tq7徧±H4#ɷ8胓>1ⰖkO=A8%,5L<@(rM~eQ4,fhy5Go@Y[/ӡ@zRf)34sxf[N2Fލ1o驑!L:$MPol,fQ#˶d+}B)*Yjg[v3W,p?B `c1.4ٝXV_rʄhJ&䉅0z }I=@kM^7>y;tX\Pnji$"'Y%[onQYlO':%[P8LլvM0n73Bu`͢sgg9X2<z)Mӧ;5]Y=E) 4]ollblsB9!Ld+y M8.F)FbH*A1YeQY sB3d- XVּGAصOQf?PicƻGf'A%ZDb%!^(BU(.C`9Bj +?&7 $A-!F<3 :iS̆l) o9ǟ}&_8[7s-P2aWkn(,}JY+(Rq)$bZzbHB96a~1Ëxe]J"k;nѐX=XRl?8inQFҦߘ ;nnc!:` +14BZYlyer:,[xZb.HP(osBˉ}iNⳲZb,wɉON\nu@Ip&F H"VW_fp/]G-Nak'}#NG֢s%6LNKZlaWCCf˂KlKYnmY1eaMvl `ʡV(,&c}4xCJ'W\lw3^an7cy7ˁ!lN1W@OﴎQv_ȘRR#[iͩ{@+7_ӄ0.pL}Ǚ3_LGF"ѧ?71;m[L`c T *Q+]*w6{f޳>LHB jp,(199HCG4ikJ; +ZJ"* +V4Q){%!؞ nFvg2y.Y-ypֳp^#P>>Qζ&qY|=4}b9goT^,زCP_3׹|,Bs^8具gXk=,>B>Y&u% > xƆ)@~dDN:Q@nQqe!C(i°9z4Jn67\uyp$RsNyNrBz6 +M~7'^vXu3{_Hkw ›L &t}2QNY?g,@HhEJz5!6H7m}o{>wTn4>jRteWxz~HS Ց9#CNht6lxL;[3N;ôd|%~;{u;!mf+rnJ 7;WsxA^N/62 S(A~ $a[!_F4|я/_!35=~X~>D>42#ḬgYfŹ(o4?bog{M^,|[Cz!և.t+ZZ-12wEC1yD=uM m.Ŋ:?MHsіЛ"/@{R/$36m|?)O9GFX ͪwj.!!DKREGJ{i ([E)xJ?$E'3P%(ʗ"&XJE!A\a gަV+Ճ݇S]c 1vh?AvlkmDMWnkwsEyt'  [Ju l܄ȑZQЋWوM9NFi"ePژe@eG$IM+{34&P +Tw}~hS_-MTjh|8C:)FѶUY +: )`(/T#V_*U*t:VٺMe~,O&gk27V;ښ=yK*(T\ wol5ѾwڏOy OM[ipMz9K{P+nl}xf3^KY+#K2GVStGo>ݾO;\F rWAӛr ?ƀq NcFDF _k=~/nxzo??GeA-AfOD +`{͐ g\o_rFڹYCàSe43gfH23`,GD402DEc~|c6ԍT.Zvߣl(! ~xoQӳ6lپе!;ۭr,SU"^jG=Ruy̒9K|"_`$S'?V7̶ +<+2.r>eE Ik#~nq3~">kL2_D$2–~ s:CCsmx-/_Ԟ.z:/b/|[ȃT$ZWqKY +)$sE0<>x + 1M-r1"c"Y.Gf_f!h2fvpڕ!@H@;C}9@,CZ)_ک&_Sskpr=bM1yl^/3-zjߠ$->qY,yz!>>64%h9mڠ 6G6ivۺRfѩxبRt [7\P+ˍĔu‰d "sTWT䗍"Scmw-?1Q"#2z,`;T ;! +aKy% s3370usI4E" o6v YkõwJ@ccqf"˓2zXyA`jwe}>|&jm2*!]Nb1-3B_@zoEġ͛`i~tU 67n8nWBC̢YA{/a4'Шŵ:.&jvPU\9IKP+p|s\z4 lĦTEye۰=UR p\Jǎtm-P&;:׷ +oc+cK6j׼'~g;K njC<%7q^Z0 abkh"+ YMWeFE +D7B]ٴc7aØKdli+ hs8g|&T&?i,I_7ke592.}The 0)[bx,Mu7#w!40ˬ"fY,T@>>R5y-iDz3lfrg64IPLjL3%~ZbOLʶ2x&:Ҿՙ}: +g#&^QM&U{/-k}6r>z>\K~=v,ulG!>7-n:Qbj7yTM':v?=UB?4m6i3wЧcCW\C>k8@!z-y,/腁8q=聼0[8v%NS\Gڪ城&+mkoFFL_Aom24Ͱvَ+Ӡ_03P3 fJ?HIoKC@YFhDRnN@Fn7r89uqs g6[[Λ?qS0UQ%O 9,mNgVd"gdܝPSS^'͟S޹fYkՃܔN_=zXE.e^"*ftF4DDF\ebs)%-M߀mЛUYl&ZTUN{Ai]=yXJ^єmq6)Ъ1mf! IlA~iٛY'~²"DtBfMH!/˒u'-!mZo{ IF(햘" Gf K}2.qNn}:jd9Qj7t,ηo[? mO.trP1j{?yL14&-ȇBM= %9^;,d k\!Tt,34Hݍj}JS)I8" +vO$Pש3)֪*' T b&( I@C}3JWep@Fpeseja:;c>8Ǫ} +-ՅmxU Z1;N+-N'՘bZkXjĂ3gGEc:#HHkZ+R`U 99LL Yښ؂`0_IaUt3:^JOt3!2БVlLƓ:k5^[=e;&'KqN "BzR$gHVҀx2}Ys6A` T6o9xN9ngh7V$/caMl) w}06X {$"h} zhքTx.ilX=iKKƈ, 546 2dO8 +4؎i1X"v0?Ny&هQogk1=}GZy5&j-ZBS Vx9-_Z|LCF1U@SZl; +D^Z* +*^D?z\/,Q5*C|Iڢ.UרUAw.jQݭ&"ffz;xDUp"٘%!lV3Ehdj1 儤É( kIìi S760,g?lm'}Aq=uIOpQO~ԍ۩f/fp9iTQTC_zPgxljPaq+vF/OK{MZ0U {1{C"_`[8|Cm0ODѾn<).r{7"%d^:bGYTщ"[l ǖOuP@4Ft7  +3 +WzS0p$a(#6fu<~9v 豳8f:/ҵ3% {֓;WIP;{ q+u1oFMZŴZBD"Y7fE f9r>FCb(z,L49̑[牆s勎V?/T>c&.<۔z'+U~վjw27o%R9yXF%݃K,v{E.gpTқJpX J(] a#rkD$Yn85Np,E@(Qj;&s2t :#J3`ľ,,ԤβGL2ɲcS-Cګp5TC5\"#L{}9z,yl˺u[}qc|Ȃh&ӜKdɄXYm"8#`'0WX,;ӈN5kYȂ`ft;-ٛ>}^ڵcRߴF|osZ9UK\.AflVWQT=̵HP/5J$Ds!cFn#p yeh5D0!sjBˑd.̾gRd#}29`JZ{oD XI?yo'xuV&6!SZ YݟG#!ղVDtL⾕fFv&|VVXPp&  zr Y.nOT?.j+S?gV'_m`T_sx:1 _txy־֭ۿ C;"$HeM:%]i^(eRXΓI~ןn"lnDňL,s%%( 2hB+)dBìX =do} ;\0Mms)q^x4h4//LLn#?Ġ2(ˎ]Pf}4YC7!R*ۜ 34umtB%EKNA8IpCULJB@a4j&i,XLtO/a^=@ǿBżS(McF%;c5]FI ΫKr(.lb~_& 120̐)U5PZg!+/|^7u I0̵ S2tbymuC3GRd{0 )f¬:٥t  +Wd.N9$"b}=20ut,Wb BDw|hPb}e-{pU'|;<9Y'$xLpE(Hs&^ i{Qdke~Yd9ň.Osy%ly-U:E:r5ꢳ Yʉ)sVY5%8'xf5M+ՙ3ObxaXb+8,S$21OYtV(i6 z)+OrlqҢGf'DNLY:'D8Ūb'pāF2$Ɔ9IUe"3#CsA4YgNu +pf\vXcmю|s}wye{ 4%b0WE(nL=Sϻϯ{uϿowws, Al"c&hÒ, \vErKRh;]gez[iZ MP3(}g!R=SE/ +Hu&:JP=sƧe/`:u/hC‡X {3S7[7be"Ѷ"RhfUU7MujR<"wq㜓ZQ"K@HMDX @3k-#(R(ZiigNkDMVyrskM>SZAg {]mN1@(ŒG{[oMb=rC(r|^gpa`rKNB.3\~f/E.W>`Aף30(YrA1iʘ$Y wL0&y(>ġĤ4i: P 3O?+y:ynwy';DNBW!82S]!>?#W! +] +()\,GgM/"  ]'Fcݨy ԍ (ǀY[B;J~Zٻ0v.4v $/Ld37#fcw{ݲӭ۬+pV:(ha`!B+.KWI®v<9?oQ΢7 F^Rg&dTM~~f 񕒇|GJ[Q|+ -[gu扴&7N~v=P.c~}1Ҋ .39-dn^ȟ-v>)'\$`oЩX +xlxlOa[kboq֠fP@#Q;U?g 0s:??$]&'ˉSd9e,_"Ǔx#]}!b3S&:It3 ]K\l^lfyҦެ-2M@QBQk\a/b0c\AaɜC6gRwf *c/+]C@95|ߤ#Mw_ֶU|M72>seUUo!SCX.')NлiD`N?ʧ^~QZg5lm([z=/^ذd լӧLotЪM҂ohGq(D`a*9Bd63*t&\fڙTQ ʲ2| jH5׸q +ܓ݄-B=" 8(C(kHa|&g7`hA/@\*^N%pdƗyZ#-ME_j3ٖԺZlm۷-ێsoe[n1^1~0͠A vrjJS&~^jsyf,i|. Kkˠ,֙7ܴ3|$\KxvNq$Ƌ{¸faƤBFl<0ogLH"GΤ0g܃R0Vdz' ierDTE]) T\5 nY%|bS{@oUG|x6YFgޏQͥMboOӦ~?~\`j7N]з{mp^*[y9Gő:UJy-bIhb|fƐ72*dF\d`QfIzQ2\o!I~L!ږ9Oƞ2lkPEZi Uhs[[ W>fK$ɾhOܪIhVL-2e2a>Z$Υ,cZr%KpmIsɚ{x,1%tFB '!{"-XtU1"%$2v"(VN_x^j4ۖܺ?7/Ze纘%ɸP|~!aX,Yֳ}W=w~Һ +qU(q4zwhգD[.mK9ʖpS8gpn6rRRXĖ㝃a-\f?Gxj*#DˡNZf_k3v;:uz-j:~`xi0Œ/Lf$_ kΝc2WWc;;SSǸSpG_3Uc)ۿ_ oy!Ipvbģ 8T>[=WT13HZ#UÈ8<"2j(=|TP5jmUG[[S&,',@/UU wҲkpi9 609 zgeA+&#O?۵S{nOzWۧu @inNqpT֦NiLa/m-[,يM??Qs߱jm5݆㥬NQZ^12LR PC\U\&,od vδJr:L!?tO"9\[rI*Q$+%U%-KA7 =r0! ڟH^l꫇SO]ZU{?PNc-q +metԅG"3G3l#pY$P<vZMB\7y^\}28R"V0Fhkdd"K%~lHLYnKQ' r!c)=iXbơ㮆4aą{!nhk{7Z}iyr}t,,DkǗʲwSw[ '] |@TNđ:n`DN!]ia.+s%iy`IQY0ndJC?*pzKOfj2UQh1&rbiQ((Hj6.K#)KyIm9صl{%"%$bB͆X82F km .lk\cdʳzCvӆ/΁81Ԟ2|)׌s6h//\֬N6h-d&?Lqgwl?0~! bp+8u'FVO؛~\Ƣr[RUTf+v23lOЪ9<"(Xx  xq\pB:ˀRPE@r¿vϭZm/Զ5SNĻo'.ċ[j+ػVE񸾩p~#i7 ƟDڽQ4=w#n5EpILe8M,F?`&:cCwtΝV#qni&Sg|-!I-.Od@d餄kɡ~@~[/%U>cpڞF(-R\Eț]rkOӻw+{@ GL/+Ñ<\m|^:jG"~EWf\4)@f\( c"[ ǘI(W h798<G''/ej 0 +=-$[O:_FQZ?'h>2}}O4z4?nRvoIvJmq GP>\x7bD)|t^qɪFHžBpi!Q+=1uDIt:/ߧ3>yE&A 7,K.hS0h\R;Kpݓܸ[ײm[KiZSO=Ҳ\lgt͓m×Swkz$!nT Ktj!"z߉<_i$P;T&}zIG~Yg6,) H7fE< {&{𑂓`r. 6% +lbddӄ̡m4Kmuuw;_:QZSdh,Xe}\ηAToD[hg|.|6yhr}9ŒSsPTcg^޶j1ぅg O~͟`|HafGft:#8pU*rU,D\c|dSmcAϣ$R\UJ]s#Ek)uQ-!Wwpt׀fL55M5ЭBXj,vrX^a *P N  W 0F-A\-UP c8yZ0%(⇫",M{rvFkJ2 ^p  >Ygƶ6(LF&A?kv~k/t:8뜗7"RG>T3U0 J&_+bqXG\U>ȫp2]ܿ*X\j\mۗT\Z Pp]O,g/|gr6QGrWY b+W9ŁF*9 CJ(Ow͹k[KuJ؊Px! +;R ? +{eLKjӛ:zs6ܔƽA΋ǎEӇEmȯ~mKM6O]YM4t8f[4l0f0lJ8 dƛ.j RY[Rɜd*yCc 2vL11FGM +T*u +S*=H1fֆ\="4e:.|̤HXG*D g U;#DG=s)Ɍ96g +4 }p8{a޷}vp_% +ҝ668Op;tu-*콤zS{wiu2 F嵷I`j˦57vU{v3ʃDZ{ɚ?~W MӕSZP!bwq*X$5(3P]J)&U(Q\Ho_E֎pK +Be`XԈıcM0=`h0G~Zz'n??d.;6X},ח>]ʍ/tI鋥;K&JP\%U^λ{KR;+'03WߜB#}|F[ W99A:3<}!K{^k )mjzSϦ~l{3{Z׿Z 펫'h-gA!9pG{y}*,go.z=w ?9~vwj_V Fl\F;'(YD F%!:+B BQ)6KH<%nm5,#Yy$nVd]#>u!dYƳ^ȳr6d94tN67=OW J҉083S +~XQ&AއIPp]7|l=uGFsc뼥Z^ fسСV~衻~0K;5>}L5dCtWj(O,+^R0xbU@K1^? dS`kͶb /fMּT U:{*c\2d%^*jAD`ji?{W)9zhkʷm/.oۀO~8;4x\,F5.E NbYUqEEE>006YeH\1B_}(}mG_L7t]I]?[wO]tYTQqߑ'㬝xJc. -BA`7Vꪼ;\m~s~K>CiK@\g@dIjSR]ފ 1ZTmwEy{m+;v۷};X])P +endstream +endobj +2973 0 obj +<< +/SMask << +/G 3015 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2974 0 obj +<< +/Matrix [2048 0 0 2048 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.68652344 0.107185483 0.68652344 0.140136719] +/Extend [true true] +/Function << +/C0 [0.8863 0.5137 0.3059] +/C1 [0.8863 0.5137 0.3059] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2975 0 obj +<< +/SMask << +/G 3016 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2976 0 obj +<< +/Matrix [1322.09375 -1221.5 1389.8125 1504.25 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.055175781 0.22021484 0 0.055175781 0.22021484 0.072498322] +/Extend [true true] +/Function << +/C0 [0.8863 0.5137 0.3059] +/C1 [0.8863 0.5137 0.3059] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +2977 0 obj +<< +/SMask << +/G 3017 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2978 0 obj +<< +/Matrix [2048 0 0 2048 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.51715827 -0.41607392 0.48547289 -0.43429303] +/Extend [true true] +/Function << +/Bounds [0.99999994] +/Domain [0 1] +/Encode [0 1 0 1] +/Functions [<< +/C0 [0.7922 0.549 0.2627] +/C1 [0.7922 0.549 0.2627] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.7922 0.549 0.2627] +/C1 [0.7922 0.549 0.2627] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2979 0 obj +<< +/SMask << +/G 3018 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2980 0 obj +<< +/Matrix [606.3125 1694.8125 -1928.3125 689.84375 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [-0.54394531 -0.87646484 0.0092207491 -0.54394531 -0.87646484 0.052244902] +/Extend [true true] +/Function << +/C0 [0.7922 0.549 0.2627] +/C1 [0.7922 0.549 0.2627] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +2981 0 obj +<< +/SMask << +/G 3019 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2982 0 obj +<< +/Matrix [2048 0 0 2048 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.87006438 -0.39392689 0.89661062 -0.40923685] +/Extend [true true] +/Function << +/Bounds [0.99999994] +/Domain [0 1] +/Encode [0 1 0 1] +/Functions [<< +/C0 [0.9804 0.9333 0.4275] +/C1 [1 0.949 0.4078] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [1 0.949 0.4078] +/C1 [1 0.949 0.4078] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2983 0 obj +<< +/SMask << +/G 3020 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2984 0 obj +<< +/Matrix [-710 -1654.0625 -1881.9375 807.8125 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [-0.68359375 -1.06542969 0.022556543 -0.68359375 -1.06542969 0.072265625] +/Extend [true true] +/Function << +/C0 [0.9804 0.9333 0.4275] +/C1 [0.9804 0.9333 0.4275] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +2985 0 obj +<< +/SMask << +/G 3021 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2986 0 obj +<< +/Matrix [-1239.875 1239.875 1448.15625 1448.15625 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [-1.58496094 0.23632813 0 -1.58496094 0.23632813 0.145507813] +/Extend [true true] +/Function << +/C0 [0.4353 0.9569 0.6431] +/C1 [0.4353 0.9569 0.6431] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +2987 0 obj +<< +/SMask << +/G 3022 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2988 0 obj +<< +/Matrix [1331.3125 -1141.125 1332.8125 1554.96875 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.123535156 0.22900391 0 0.123535156 0.22900391 0.18945313] +/Extend [true true] +/Function << +/C0 [0.2196 0.5373 0.3922] +/C1 [0.2196 0.5373 0.3922] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +2989 0 obj +<< +/SMask << +/G 3023 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2990 0 obj +<< +/Matrix [2048 0 0 2048 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [1.17919922 -0.35253906 1.02099609 -0.35253906] +/Extend [true true] +/Function << +/Bounds [0.47918701] +/Domain [0 1] +/Encode [0 1 0 1] +/Functions [<< +/C0 [0.4353 0.9569 0.6431] +/C1 [0.4353 0.9569 0.6431] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.4353 0.9569 0.6431] +/C1 [0.4353 0.9569 0.6431] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2991 0 obj +<< +/SMask << +/G 3024 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2992 0 obj +<< +/Matrix [2048 0 0 2048 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.68652344 -0.84521484 0.68652344 -0.70458984] +/Extend [true true] +/Function << +/Bounds [0.47918701] +/Domain [0 1] +/Encode [0 1 0 1] +/Functions [<< +/C0 [0.4353 0.9569 0.6431] +/C1 [0.4353 0.9569 0.6431] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.4353 0.9569 0.6431] +/C1 [0.4353 0.9569 0.6431] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2993 0 obj +<< +/SMask << +/G 3025 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2994 0 obj +<< +/Matrix [2048 0 0 2048 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.68652344 -0.84521484 0.68652344 0.140136719] +/Extend [true true] +/Function << +/Bounds [0.058288574 0.87219238 0.93945313] +/Domain [0 1] +/Encode [0 1 0 1 0 1 0 1] +/Functions [<< +/C0 [0.2196 0.5373 0.3922] +/C1 [0.2196 0.5373 0.3922] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.2196 0.5373 0.3922] +/C1 [0.2196 0.5373 0.3922] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.2196 0.5373 0.3922] +/C1 [0.2196 0.5373 0.3922] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.2196 0.5373 0.3922] +/C1 [0.2196 0.5373 0.3922] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2995 0 obj +<< +/SMask << +/G 3026 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2996 0 obj +<< +/Matrix [2048 0 0 2048 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [1.17578125 -0.36132813 0.20361328 -0.36132813] +/Extend [true true] +/Function << +/Bounds [0.058288574 0.87219238 0.93945313] +/Domain [0 1] +/Encode [0 1 0 1 0 1 0 1] +/Functions [<< +/C0 [0.2196 0.5373 0.3922] +/C1 [0.2196 0.5373 0.3922] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.2196 0.5373 0.3922] +/C1 [0.2196 0.5373 0.3922] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.2196 0.5373 0.3922] +/C1 [0.2196 0.5373 0.3922] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.2196 0.5373 0.3922] +/C1 [0.2196 0.5373 0.3922] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2997 0 obj +<< +/SMask << +/G 3027 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +2998 0 obj +<< +/Matrix [2048 0 0 2048 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.35839844 -0.69238281 0.65429527 -0.39453286] +/Extend [true true] +/Function << +/C0 [0.9333 0.2392 0.5059] +/C1 [0.9333 0.2392 0.5059] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +2999 0 obj +<< +/SMask << +/G 3028 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +3000 0 obj +<< +/Matrix [2048 0 0 2048 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.78857422 -0.6015625 0.94067383 -0.44995198] +/Extend [true true] +/Function << +/Bounds [0.17614746 0.50604248 0.84680176] +/Domain [0 1] +/Encode [0 1 0 1 0 1 0 1] +/Functions [<< +/C0 [0.9922 0.3922 0.5529] +/C1 [0.9922 0.3922 0.5529] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.9922 0.3922 0.5529] +/C1 [0.9922 0.3922 0.5529] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.9922 0.3922 0.5529] +/C1 [0.9922 0.3922 0.5529] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.9922 0.3922 0.5529] +/C1 [0.9922 0.3922 0.5529] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3001 0 obj +<< +/SMask << +/G 3029 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +3002 0 obj +<< +/Matrix [2048 0 0 2048 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.56689453 -0.62744141 0.41674805 -0.47729492] +/Extend [true true] +/Function << +/Bounds [0.109863281 0.37359619 0.84680176] +/Domain [0 1] +/Encode [0 1 0 1 0 1 0 1] +/Functions [<< +/C0 [0.9922 0.3922 0.5529] +/C1 [0.9922 0.3922 0.5529] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.9922 0.3922 0.5529] +/C1 [0.9922 0.3922 0.5529] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.9922 0.3922 0.5529] +/C1 [0.9922 0.3922 0.5529] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.9922 0.3922 0.5529] +/C1 [0.9922 0.3922 0.5529] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3003 0 obj +<< +/SMask << +/G 3030 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +3004 0 obj +<< +/Matrix [1434.28125 1461.875 -1461.875 1434.28125 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.88232422 -0.75097656 0 0.88232422 -0.75097656 0.163085938] +/Extend [true true] +/Function << +/C0 [0.8353 0.2157 0.2157] +/C1 [0.8353 0.2157 0.2157] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3005 0 obj +<< +/SMask << +/G 3031 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +3006 0 obj +<< +/Matrix [-1363.40625 1528.21875 1528.21875 1363.40625 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [-0.077148438 0.24414063 0 -0.077148438 0.24414063 0.150390625] +/Extend [true true] +/Function << +/C0 [0.8353 0.2157 0.2157] +/C1 [0.8353 0.2157 0.2157] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3007 0 obj +<< +/SMask << +/G 3032 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +3008 0 obj +<< +/Matrix [-1579.75 -1303.3125 -1303.3125 1579.75 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.33837891 -0.77392578 0 0.33837891 -0.77392578 0.114257813] +/Extend [true true] +/Function << +/C0 [0.8784 0.1725 0.4196] +/C1 [0.8784 0.1725 0.4196] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3009 0 obj +<< +/SMask << +/G 3033 0 R +/S /Luminosity +/Type /Mask +>> +/Type /ExtGState +>> +endobj +3010 0 obj +<< +/Matrix [1448.15625 -1448.15625 1448.15625 1448.15625 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [1.390625 0.24316406 0 1.390625 0.24316406 0.102539063] +/Extend [true true] +/Function << +/C0 [0.9922 0.3922 0.5529] +/C1 [0.9922 0.3922 0.5529] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3011 0 obj +<< +/Filter /FlateDecode +/Length 18220 +/Length1 33492 +>> +stream +x |SE?̹~m&M&iHK m W.ڦ[(K@EE@ +"*Utu"^V`UDs&t{̙gg3I 1M@avݜW] ύ{ #`sf.T#j -GkP5j|MA*HE t#]ǥd\cF >p*(`dӐgaAϵ.|4\hYwrad@Ys 0 +X8$u ^h0;/ 2a%G\}H) 0\3`&̃f/Fq- fh >F"DZ`{(O_z'=Zƶ,^'y;\OJE">f D\al { p5Q~9p;T>s.hyEFǝp`5'Ʌ`U ax +Z`5aXy\~ic6S uqx6}.[`+lga;쀝ݑ!/˰` lBv1tAu\B"$AQȀh&@#Z0`4sXˡR qmۇri\hGo-\ #eZy^ C + a^/inB[$>. C*!U{:#0 >8 +8|'O WsA\Kpuu$䔎P,G6DHrleUާt}ZmaGPz.B #al}){HlFꃞK Lte WW~x6c Ŷp"/Ġ%SMKt=A` ̗]+F =Q(YC6^XB&!|DE$rwTCTo FΨAQj\~ᄡ%ZuۢۢWk[zE]"Э^g׮GտW^ 9>Wƥq#q?L/yɽ%){L;<[5ϽkNӝw>k ~5S&WWUN𖗕N?dѣ + <#606hk*\*)iEZs06$YGN:s0_@m\g'h墙o3HeEVsXB˫ÅjsR2*X,yr磸ѷ\_s;xh[P4n͐iV\V_6ܹm#l`[-im"Y&bkqjV[B=[<9E3[c|֊F:ުŸ4QPJ&槧QfE#艹Z[ )[ eن(,(6|n.Bk~Š43VíVFDF4zz&VYW[[MP`\۫A66FwmP`\PU86:(0( m5Aq$V̥#*:+G`ߴjV57UAm$<$|#Guk5SG[Pb[Al*b qqI# eA` +l fG*,Cb$!UA&{KEۤrIP<((yb.kVWsg"b*(I2 (1,AmUPE=)zwq-$ JlAmL]py=I/ Jl!|bVH$Tk. Ҷ筋,4+qTbOO*[[E_O@K$C.5y"HpOֱm;ֱ"_w/Hx,f_5e Ba$/[U39#l θtfi1~ bU$k,ۍ@/ +լ.( 76 z:$׶b.l;ߔD,Aʆ\^f6֚b1ly zux*(#)/uCRm +'VuVтêI22aVkkf9&9c5bڏmF.mXdT5)זL9DA=hh&Z{[Z֪ͮ0U$5L[-xF2s3Z-ai$؆#!K36Uh5Id9ު`OeR!A#*^OZs㭲qjsX~ NjFQ!_m6T-N1Qu:*;5f3~x1?÷2?,dø+wR$C:㇨=yNC m9b͏kZ$e+?ɑpWEx7rC1avK{_`pM0$7!?~7\x(#y5G簝~>}D<7D*)|̓<9xr'ɇ<'x>Oy.O~Ǔ<9“wxɓyOMyO^!x +OdO'CVp3 +@rQzSQ`9 OZj̡M-mU{zL%=>2/=D4ϩ{bZ L"o݀`}'|BB|j.35y;<Ӭ3ʆʺJG54Ԝɧ'S++ݕhbzEYrʲ9QFsF7G3UTUzBԝbe*@ўe;7)XVCTsY-,!nOH4(jh +Q!&M:kqvS]%3+~"p~h7:L!wD"@!pN8;B8N>$c'x%p;: M- I x8HP>BO`:h#$n%2""y %p9I`6;N`fh$#@@Z L#0@ )&&PS;n#0@%*x (#PJ`(!0 "PL@!x $0p %"0=w!M`0g{tY"I38 "ޮMi[K%u@ `%HBܮ& U/@,=4 ( ( ڕ%OJ@B@L@D@H@@% P(KLV%5e骲tEYbIYb,1,1,1]Yb^Yb,1]T,1]P+KL%%*KL*KL(KL_+KL_)KLg%/%3StZYb\YbgeO(KL*KLT>QN)KL+ +kH5WxMPxM*^1kzO5^5~*# +ԩVxMo) +ɳMkz]5^UxM^At@5^+ +ikڧ*Ԯ޴G^o-7V^ozY^ozI^f%7(7 7=/7ככvMכMMzyyiV{riɴQdzRd k2=!k2=.k2=&k2=*k25ɚLkeMG&1,7PsbR[_M:έ(h*n_CWhu0^xK)A:hA TNRՆ#ܮo[~KUm%{< >^Q.A{Z,נm*yCQyӓ2%Q7hbbޣxCAP(Fۛoo777yy`u`7Ghssyv{y.ٛUq8rl hQ(> +zCC >t|'C?>w.]C+зC߀} >Y/΀}>>t|s𡿀}>g?ЧC|C'N}>t|C}>t |}~>.z||m >C +>t| +Cjj +-C/z|v=>|h;гC=>|iMCOmz|hC=>(zuCkz||ACj|h%Њ^.ス] +>tO\+EW {%Wz+ݹRmꝽR+@TR+ՙR+UT{jCT{Z+^N^NjMTJWUWz%Z+щJWe,^i^)^q{%+1Oܽ+aRrJiHr{+^) WJYRRFC_]v=Q2 +4T^utT*A: +4owFQ1|J50)I:Oi Q.yTɮ 'Z%Pb +h:O9gz! +@>`r9HmQso +ά(5ۙ@h8]sPg(>|5^:]Qb }5 ^mI@ڱO.HB;BS']K`akخ&y3']7'W,Em1aMsRU;FRWƬzc~xZ5͞>:pPQԲ_}jZ5mo0k uF$cL=p3!<ÐSCVYnBx\+5=3`i".!{dxy*B"|84HFywTL'($8ހ$?BHb&@wFfM`5zHʙNJ&*hm3+'>Ÿx7)G8扙C>8:qӨjkd0/Q́rH$(4 H*-z#(C=*ŔEB@ Rey!6L]NnҹéBSߙӢ^!e ?O d.NiƩjLnt%ω+w_A?>|1ݹmA6A"V"S$vxy-%"av;]{z7rt9.\HL苪w;xD&rXHV;߄W޹,cNځݳXᏩWQ3P8t@2xp^-W<H~̷~M2(c (Y7 @ DMD`Jg~qT<ڬ{-}Yg%M\4!iœ&..M6{)/nϗ׼t7ZǕ94k+_s>C:(g;"k H=+4]<-zXJl@ 5].N=- +\x[b9u<[^ה=s5k7οZq72~6!hEwwXC},ҰFeY\sW !$'Hkݧp9ERa+`|.`H}HJp*8 ɇ/Av' +l +cb#RBɟ p坾-{a8zVYɔϴ#)/}K/*0'-vJ[,_pkIY`cd `T,1C 19_bvcͱ3."'hS..2y< E߅ˀfn3R 'T0*B_GB$D !B 0F2f=YiP==QRZ&a +T":2OvNNF˥rOnJ>xExr3,\z{c_p*[ Fǟx6<5^_Çlߵb&p7zR " Z(@ KhF&%y<:e>Ց,P*J' 93+V_PGx dGM"Z֢s_d's} ++B (!t +QѴT&b,yKEҩ.;Nov\{ɟ + YP8}B܍.enSõ"VBFfmU7&Ϝ\x_:iq;*K)6,oAß|t#|$32]tлRz~-ȺHj:uxTZQV+OX/ɑd&hzͅ}/)YT oׄj2sW[}pnQKJkeMȱ)=cLJ$ر%+FImHJiiY<"Oh-5ouprq=c88gyF,u-?(WX0}~5}s:ɢ!wSzj:A :มLLxY% 9q\T}Xzt,02L%PɣϮ-ZcF%œHǣ/RTiUFɵ6] +SYnˊP^|kk'/,=lN`lm h.Nb(=FT*B,Z^*E"Ds ꉒrpb_y> N}rt?NC"r@TDPS\*f!.T{ $kbttmVYt1> +G_Ch{e_Υ]ׇguZa>%VB +Gmd4FPG~ۀR2o-3)Y O>'/a'hXI6^#n3f}Yc3JMq]tp*eHFj⣥l⮢ߌU]/6-\#=:5gŠQeJʢ$TgȂ$Mw)`2tiaI8DuLePVjӦ!&  6(zb=)XbURZtBZ򧿆W@_~C^2ǎ!b飻o+ȟܽ[RZM۰Z1Y(g[3dF +;ή1]*(Q7< +1#@/ %!4#zTZ.ϻ.t3B倰\KRt)F4%.'Sd'4vD|-:ږAf֯g!:)3>.+)::)+.>3)feɮhHe66 FРW@MU +!$'Q,ό+d|n@SG>#ګNHdR?$meJE|vͭ9,zң.ӨqR[{zҬjT֡:m~&m A: F{B]#R!ͰLE\H{tT!9>biw +Pؖ{L\- &>\RGzU1]~݈wq ^ӿ0^?Ð ;U r!& =\>!ZXo3K r~E\DYb܅>dVץ +.R57'󩈏̢3SG'TPSkB^eNΰlk2P>Q?(ۓu1ܪTu/^-LRhO.^B{U g6^a[F`=)32]\uMX{:[x=C k. +plEWS8۞yKiOo]uyD탋RկV,(<.kz.0: :82{19,cWS(&V$/-t؞2nvQqB(<5 {skxk:FW:t`##C.1p'$g FI2CLV* wi9*FUZOq;ʯ9ՒʘiiɮM۝oD|,\>Œ_ooYqPQPͣkZ$Mwl&Q8Z)\4WpcmgA:dbF>walK8s>D!]:H u%9VfC-*v4LBGUGJIW_ ?vv9BX/HBPq% k6HaDxpKCFz;/yvOZz&k֔Ӷ=lc9yչh[xEeOn5TY<͓䒫jVј7p{eATrb$BH酪dy)\iyӤ'ӈE-~ +<ytʍpӫZ*){=Čvok_9sG*(٣H~0Cl Qһ -B TV*rWA]'4.T^ p1i 5?L|x䑥>Y^^Vݻ# +gޯ5&\|>"(YHHbbѡ?xĴPT.ge9NאďG6]Ih=Jr;# +k!kٹ?^;\;ǯk c[\ YF ɤBD*VhJ* +rSp.;;uuIU2ZrXT*S<+3)r;b(£bDh?T^Jtw~ά:9/B?R +DW\I KF# }'Tn'Ԅgv ?;R FGdr}N)`lAR23Z%4W*Rsh +btfS4&. z%qUe$>~rKG;T]*^ UW1J1n7|2II =C9Ɉ3rFygN7f`p○_=:3fH{Sw ATݽ%=u_}DW'8"5z`>ev dVyL\v }[ +ٶm# ~X[אWe:dMSsA=؉qЦ Ա^Hʞ8"`Hhq8f4šHN#DCzՌ#}ז#1|#D-@mu&wB/\-@ƪsAk(&:^tʣWKF2|Ѳn7fXƸ2ؖkWdK=Ml `MJD@fsGjB5PGb? 7*P[cs^{ HYK"$jhGjVe~;ٴ%#Y1OT_Yg +˰j֌8cv@祗2CF} 7'UϺ~GܓhHf QՀm 83HgEG;l;5z۩@0Dtα7 k2w7⾕ \ߒ([lncaSnnh(sؙ9cyc75%]t& +(-?qtC]`: Ά;7א&$b9Yz\&uLpRd2LFP!ps4?Ĺ`pT4VMlP0uvGgg_ +h g⑹ʦf[@Mz{A!4c "F&H +)K!)%P +ZVcĠrer8X4YY'=)QȰ>2ܒHhX5l͖NڦcÅukc]n +BFXd,O^x0 M:8M_C»Xa?_=4EuQ!H䵂&ڙNBA3|z$"1+@؝z}k`?ФbcB[iy܎x>nG<0F0Nx CkY{Yhdah(7Ĭ)!Ch~TdTI עb4ʨ8758PPJ[E Uy5m3OR:եֹTIK(beQ"bLȍ"1#7 i{g;h3J;- >=n=n'N'>jA/5ד}h}hlx?~ގ'~U=x(DO$Cw! l(Σ'jI$=kl6F'霪*rԖ_m! e!6`ujR2J_6Fq zyqEa t'AyمMRw!JQxzxOmu;»7\i+}.7n\wxidc}GJ+{D3'&[PG#iS LSh/^ V5L^U;t ,_2y؜5ʖOس +fsD5{hVl˒F57Q7'V2Xs^ّx4sh( W%9i GsbỴͥ}3 gH;0{ⓏDQKz6h?kfPE/2Fx&*9C }OeC_7Rĸmx!kIJ +Y^L2h<{ugkC!u)3 +)bQ+~;36zoY#^Wh +mXe)NN[/ x٣glQ=,YN !6 +00DGbTAkCѫ0^]vv4>0>;C1t`bP}1e❋.o;G<_q;I˳ӿ JѶ T+9]EK#Mrr 4Xxgs-_0x֖;9x).kҏYV8եO.=h ]jPƤ=*o \{ۆOjmҤCⳛ^I/ +/-&pF(A"Bz41Gdj| $6tY-q.P{ԩG8|4`l/>uS&tsso޼[l foًV4_ĸw6lh_W݅!ӋƏͷ?m[MhAongI$i-Ih-TR TP Cr&6У7!P$=x+jRz=)zНZ[y̾y߼ofnd_>>/s{m^\zR8K04<]J秆Ԟ/]f`9VU k.xț Y8 Hޘ_~˶a{e`nl4꩒'j,^cy_+SqiPW>d(޾.|f,>E=j2jCZ1}W s?^qBM6M6U7NQʜksޗ|VN'kn0V[ +Ny2׊m{@fz @W_-p'ݱH>vFO:DT֜LEVe'=> +stream +x}|[=IzSe7,˖lKq+*E,B RwѱLD6[}NVPӆ V3' e-Gmشn?!({A㶬]kYަէn#>P՛O ! +!2[F&[OXz?D'BOL䭙Y$NV}r ݷy!dBԏP=l@vQE_RX=E&E@ oA{_kژgGZt%I-b-5?vs*NЛT %Uޠ);z=KnF.z +֚jinjL6&j㱪ʊh,\* >"Kr;6s,C[& +ϘYOHo 8A="qUEUvr];Ӯl7rz6Ɂg$whPL$E?03~`edzNggo8`spN?zF҄!㌵goqճ8wM AQWճ7mPճIt\㌻gLOW A@7zvd-(䌡1|]={[]={!j$-!܌B]={+Үm1 LJeDQtyWޘQt8%7*Hi JqPEX1bxC88ٛ4jr%齙#"ډ,hǷg랝{;jxmo]Oǻ ݯSqϛ};]w_g/?u{x쁧xlypۃ?>>{輇.zև}Go<،.[~|g>~Oy?yѓW>))S?س={ss_ł<> /$_^4XM/ /_~y˫^/_ۯ^iye+=C~AiӵlSW !ڿ9nho0c /# +ȝ  j!GBгxCu$~ߢ}B֣(Nd0yL)KbVJEWC^E[hinjnhμTV{|zϏ +ϻOzq۱XVp?9.+$* Q4-E0_)'26`@8DH٧Mvcϊ`7[ s4 q{$.P%5$v$bu. %T5D|CSsS#b#R Eʙ?]sYOxe"k#cD^M0v)mqDOCV'3?'k;,Ͳ7e',MTegE/=ȄYQK6 t)0e?I` J95 M,ĝ?>gS~+$G\a%ZfϘys_dW SH &3-l$Xhˍt}>44}v$$)͔l'L4*J>_>RJٗ"d"\. R Ř LTbkNn~M/7zcy{2ղक{x?ȲL4gghY,?R̲unuWV]|/>PeZ)KPgG {]q#g>G0Q&Yl:lY +˹YAp.|\WjLܼjH;sR:mڼF*۫>;fI,UYM ǚ-&Yr#j=rʂɲ"6C}/ w]Jܩ:y7E#y(Xh$Ќ&phNX`E~x?r(h7rbVRkC 84'4W}_Yė&.Ka_B^|mEaY;EAษ^[x⸴Rp+AS 뽾j0LkHG&FVxȒn%)Z& L0,q,KX6#w\j( T[-dXI &9R+Ҹ=]VՄ+Y1W8$xYp]-%)DYGE4.@N.<~v:ˡ(,M֣jCG+k,z*eYQ5=,0 +4E*L=(xK1 xX VF#YM#M +RE1RV$ 7R/^~}Rq^?B<*Giwk +r+F X6H\c;Ԩp)|d7<, ]XTcncYC?/zG=a|_acKP5ykwvC4?R(NVJܕ`5a )ePBf==٘W|Q2qcð/!ZV{I+&7qJQ}O6'YawFvz(6u}$`?GIaC70×?uEmw'-'!G5B}/бyRS>yBcySLS85*ΛZyŘiS?Ja -lGb5a5Z֨&e,O\GX2Mk&6Oldm<p'Mv0vvl’MkT +6ԦDM]"a3r$6 +䪢0i c ڪdS-k9ےlFy{ۧ06!97l0ij^^*K KB@Qjf+(2lc8a0o;ĥBwCqB\{k,;Pe񾥫.aINjMNF`ˀ#@-TĊ>ɊQbҪ%< TDT#5.HEn-IT,Ie!&lL4&b!MZٰAy nLxhֹDAmU;X־c͊@5;, @3W՛{&0<[[=abxZj ZYQ}x|p|hUWs7цN_FКs-1nB VՍ5lk^Ȏd-< trG8.&]|f mnO77)tܜ9oᖣon֭뮻- +_pnϪU=^x%uXuxjO|%-koښ[|Ƶ[VοV-*[ F>.^`ηWeOu峦M׵wu[N&ͩkh;.1Lݾ|=]p/9u+9eʑv9sk"p4nm Gv|^ 0p(|hpgL~TCCj媖aC3L&: P:TV- a > 8<'Lv|ĉ[ ttut}m#V[תRnk6ScI8v.isTV&3֬1k͚ mYmo:]411]] zUA?31tѝe yl\Q +ғh2!CTehg&ݾ(=E܌u~0ĺC&A ' ;:<]6O[(ʺ>5CϦzlT2P&Klڔ#tUG%ࢲO\)w2hhVըK.4\+vX -=n +̀#r6>AQ{:EQ5:#+JtiɓYETEk](Z| +f5ܱliYgŎ|r2e7jr=:yP))W`EQ7^W_QK h +\ pP)%rTK}:^$:x.#wO5{/ڍg~U0Yu p +Kauo/ +0kchEaY%( +Ǻ멏GuZ Umއ+:XfER?B + !>&ײSի"iYxߖ[Ͻ>soVCF']/. ;q+g1Ɋ‚r5Im۔;’$+<GHiuozqUHZ 2y;)r6m}ב4mQ%L^AXgU6Vզ-NN_8*%Q];QM:` xbel)-vƐAFe!䮸"ޖӶ4WЗFO?~Yrnn#χ'TzZ1=X:Fg n0]o$xITȶ†bGp +GW`vXUIZv:ebLE;E1`ԋB*u*eP"ة` j v\x%iv&GyA&Tm;'2|>z,L1sD\4cKKl1 /z77b.XM ŘV]wEט:=V/PGjBk;0(b; (C &OUE`soj?X%Tuam]4I#&=6wmg(BIAu8G8] _*Co7Ehv;ж̟c3(_2>W./(/XnQA7C%+% 6*YQK4i:קf|>xܟehzo^|Bf9[d/hgXձTwΜ2 jSԪ5Mf ea:&*&uL5QL>}@[SQb-cĢhb:JE | drY 7aØp ]`(WYͬGBuF[2ȧU͡,[9DpG)&&;Z*7ZIYUtIUQ]&SvJNJG9J*JxCx4}v9lhgf P龳4%wFbh>92P3;I@Qj1WZYb]{ kK6;ـ8(Q]$fL0a52<p~ +\@ckl"wDq钆D".) w0>hpkN>vlhKΝ8qbr\ÄBߧ6(N P7B9b^H[*8N=>Լ^&@ [$Yt zٳ]}zw{{gtOԍ=UE鯯\S__3> +KK 4R)K.1/ Q3%s,K]S;:ytz*ZeH$\PIz\q.\ U5CXS2>ږ̟}>}p1͓0eYh46{Nu4Z2ڟt{u]C~6xGU*]1Mθ "4 iĚJz&Ǯ- oIfe|>鶶;:6/H kZOjLYf X,:A*#H +YQ' ^Ƭò$=DaInt8PL;h[K:7HeهL؂4`/)=x7ܒiY+C4mN:Ğʪ˪*|G|ԧO(AEjDT0ޡƈϙnhkܲsӼxvxtMVUEZX%RURQQҰQ=!y? ʨqHKiSMFRYأ(pD4_"/6w +CTiU=PrpTsqj4[x%[ScӭIbUU G\e|xרּxooZEVZZU_:/g[::hb`rD_~ +8QQ1k4^-܃nREaTh/ ͟g+ .Wd(J[vΎ~i=0]gJG?tdN 9k*[GEҚu/bY+9m؋J.q@J.6-fmFj1hs-e$NhU|:tT1@X^f) ewX[nE!0mC4թ-ǽa٢oU`8E1-smsLM[:)A%W =MoQb՞y@{cYqrCFʗyϮ&IYtl'TK[Dc-zհ4 C|fNin-7(;Fg%K[ܸQu r๬G|E_VwmNzF4Own::D^1xќ}WU ?ӆIzZ٪]NGe׃;^TL}b/@5fҖ˕\OZX,Kܮw YbcӱdDH7?:u)&oIwtAӵ2(wlaY"`2ȵeuu)%!\V҃`iTG,I#qu]K#|+kNm36ǧ_sH3tW +:r۪{auyarN9U89O]jPYQ D1\`zHՉb|aʀb0ʇLlmNN#qaw kΨY;[!ǒ[K: Vb,-im2yO`ZOԜ؈Jj5M8FƨN_b#O+]F݋lu]P? 3fhqT-&a ͸m,C-F ZW5. R R!@tJni B6q>#B\xQVڧMWk޿*$fe8b.0QYN./d3 *X$Y#}F5J?Pwo~wO y=rc|{i G0aP2&{`Q,4|E.w'>p)IKݘq*(159]Ltf{T8ƭ6hvƺ%ۡZ /sɔrR6K?jWLөk#PXXJV2QǐQpg*Ne'{&ejr'*]<&+ԹJ킫[WIb5|9D5iX?DvK-K<V鄨:L,aĠmk]* wn']NOIuR$am[o +@n:2_=n^KOo*bg ^> Lf0,y5e q6qOu3ŤR%RfAӔP~(筌.k\R80.$*N:bE͑$zsD e̲Dq6\9eg~tOvXXKdJE(@n7ZU[VF=r^Pa _ Zr Yh_-O6 k~KkTCdٵo Ca z6\ziY^TYc[Ծ6ήTZϓwHqTflpȎ|Mmj{brrV"rZJ^Ҭ)Y+eAg{ {lw L/ =^iB "$]+,vdbՖx0op'sWw5a* N=Oz ?7^3+s|M]Ka}ߩ>q$׶S NG*09Oc~ |q1Szm M}M|RW^DY l"ϋfgPyar#Mw8^(N_.,|-f+2w*m"3w}+E#̡zp]d +Lb%C9fÙƤ*G# h_f>-^l|}6Fc@@qR{z8] YާإɸBq y2~;D2$m.NV* +8t*=ׇX8= GhȯDj*[s=rCQe)rVǃ=ԿjG@"ӂ!@@/iA{,{@ lQ qOq^$+2yVO4)ո\9'6dEEOn>M\;d?=Y%gѿU#k.M(VvE{q?!K< ^:J\(}q3F4xq)V⸢qi埕S!O݃Jۣ2۶hpkT*P#Cb#N`kRP;6 ,:3sUTh CNx$.,!tj3^V̰ngIl@רw-! ˇpG݄{q,v{ܥM[m{aioyjKWXmlP + R|LZa;b~OHNדA2"NsĔV6WN1Gd.%v"T4EZMfGq٤b7M qbi tCڊv՘<0XE48{`/qq*Uō&*z< + e,<_nwa.=ZA\ԵŰ[$OTV3RәRQty*$+ !N8F?q{N/s]۽pFhj{Q+u;RkAtLeVEf5z-q|0SUzxg<2)KZgtw66`wfeLu?/qюy42Bߢ!\4)]yd1)[@MO4.C%@j\Q /u Yݺ4\QQ4v2 $hkKuXbLxf .m|RrJ_RΛN<1lQDj꓉|' SgPg@tҾ22a|a` X{8&mA' ++Jn,y2we2eE9p- ]] -l54QFvTv/-s.KUU0ќzܸVF5$de]ݩNZ1!ْjwR6Z0AXsK]u)hV鯪J$D.-fm;%Z[Euсq;!4NEf-MN'w+;++:+>oZׇ0jQ`K>F.5k.={ѭMrS)+&k'W K3T/8v`[]m.7o]N~ud_WE:#UUr^ZzDH{x`}ٜ9Ksټyȿ+;:2>|R{2){bʘG6ò-=fܲgŷ\8cM^MP(P?Zv?~1%]Nw܏gYo\~f#)^Pτrfes{6zT=Yޞg/wL/cD/5J}.Uʵz9 i;<}Eۇ7/׾2D}65+cHe }.Cakz sׅŐ*=;㙼_m=CKѦk=FKkzV:<$2Tϔ{tfGꝢQXtyD\(,^ԕ%bg:r)Ԭ7m0Ȉz7yz"skjCݥaI7M0ڤn6#[ϛ{yGQFG0zlF^as(us\T$H,Ðh2򣈱&4,}s҇¢)eYo"QAaq^8g֯]6kzPX\1*+0u1yCgҭXi}s+C:{wdQs?ɿlL6gkFd[G[گgK5"Y#oZZ͖V_ ݙ_PXFH&צԱE'd#l}W[uuȶks6|hԔQpraraj>eA[U2:sXsf[v_^II$#Vcf-m`oZ  +jc)|=*^ve{+;|MŃYŇuTl=dܠ*%hTt8 'LL)ycdqEƿ}tdӞ=|FOF--yyuøV7N߶moL q ~X@9r- +oPƁOփA?xƢ>öq_) +CĞ/8D[x'$.w;lBWvˉr12o1j?qģ4x88e8cUG?>7F#>1y w>X9'~O-_LwaBXg_7iB WL0>TYÔUrļc:VdĸX7Q03f94dBhg(k\8r"?%9җp8d_sj9 QCv?2v>9s2! ?wǏqByM&7!ty r92y89Gi G8au syWs:M=3_ ME>[.}?*r/_?}2~7Gz̺ci˙^_\ ƹ􅮿\==_ ֝ sjw|vH0ѝy5o?sq9+-龍g*C35,ݯc)R1owT={ÉǑrXMٲy}a}AE#$t[~d9;/`ϵbt/l(>~7ȋi@?j.R_ʚ_Tq4%wʗrOGN kFy a"fJCKJK Zc5KkMχKh> +stream +x{ `s沷lvgwMv!Y$nrI $&bJA$Ԋ6BV*ϪWo.Arрw J1{f~_̹̜͞y{ H&J#j//_uå?{0?_[b)]`ɭ<vi׀}`Jnn#1 ^c׾xO5̨OV hhQgj7p_f]d7\3gz/|{ qmݍR ꮝ9tK)l3w^t.n[<'7y7̨3s.dλ%@v=0 zJay'b1 !+ +6ZC], Q`OXK_$C +!=6c{2^ު/eAy~h͌9/~qhDS9,D @8,D.s]ɲ *Uѫ]c0%3jwϮx +x7T!C2ơ?~o>nQ_x{^e쭢T;5~L0&.l~cSJ_E =|w7l@=~>^`:ȏׅ>unM&̄:\1b<4`&c r@3b&:1ߚ'k|fi2򐋡㵶f\UŘf4jeq>d\kp dLL\\hjk3Pub7e_ٷ˨;Ný8.~[jG74?7kl+֩#9ͬ)^w#qSq|p;Xm?,<5&l؁c#֣aa| ɨh,r܋ lfl^t=[ &tyu nvzܜN.﵍N9NwuNZOI^=+%{̔TόMis7~Zh)#|lyq!E(Cq~a_㴃 +.O +I>D(dt8#|xb+( #CBqq<'γcv̶i!޵+9%Lb.XQĊFb#XN$,'6pڈ +"PA v!4_MFΉv HQ@#XX/+kn2+TtO1d&"dSdS/wEHEoE"LuBn4WlBa4Q05xM 2.tidž}+a_k{W&oxt +} +ʽ+呻w w ]+%\Zis\'ʎ?rJG/ ʡEz.Sz*Oz )n)-) [ҢSZ딥,Y ebrb:<>,L5rS@*O82xubV~EΰZ%hJ23/fάĭsʓ"&+!TɕlR .X80P._)t B]!_Š`dQ^9FurO0/ORrX1j !wVAE喆 *UaiCj/bJUŞ,RkQ(J?|rگZcQMT=10wܹ6Jr5j BժNKU>K:SaKU!K?WO7=gs*ϣrY*5NT>Gur*UTX2NEE|GEڣbRauY楤MZcN+.Q*RٰPQVT.KRQ PC%Uؿ} 6mYdPZ?_Z?SM+Fcmrۤ*[i.W_X&T/aɆր5bqkP5|!*tlΖ[>вZ|lMOv޷ ]9]sjEbU[}jd%Z6O.m%V%lӿ^0 d%j/ZR5_&t÷g찭m>0ol_P[]:k ےmӴq\9eu:mVLn?6I5y|>m61.YlɳmΒۖnv|>\:}DTe7ug}wϧ)lb[[)[b]ؒ43(D岊PP\JMWiw>KVYKr;>KMQ$V_NvGNvv*W\uAU]^q'U<1OOiA颶2fܙ㵳p{vTdmkǶնՅi4,֘mf.L^Q^J dTNmr1q +۞rC]Y}3U_4;kd*GKR>3SYeUa 5Պ:T,*99. 071Z1ZaZNOmX;1ͳRrtOetϙ~_N=Mm6].hmQYUC~|U8j&/ɅK&26/UjYlLaVeI;"P%NJ4λU8MݎrR^9&'{ 1kd5!tU%@^ZY#\q5҉Ue r53MZ!Uxz@k3n#bmRB azXN0=ljmր^$ !c%s55C `$Xg&ij+5Ic +# Vo.}UH&ܪr*aR²&UN&1/V+S}}Q@xP\zYI'mQ4 +o#e/t!U547hٲ|6ߣ+#U3~#.v+d"-'-Y[?;7Eo5tRtǝKkHl2-)L +p@^Ǿ Tʞ"x82+fsp9f[*c <"A` ӎ2$#PG9y +?_E''r Ar2"~*?oWv~Wx<_򍼐˫~癘,2L5M]LLHEQp.I&T">lORS"8y##wEקt&'[Mn0k.ܶemmO¹7~ʔۋ$80NǶ/g Թڿ{'S9__oן;;q'茼.^K=f{cKll[m|؄(iSevdew fi6lP2g]="MxEZ%=&=#H<ėH(NJbC}f fb&Ev3h&06sfbf~9恤.M5͚5iLYGFtB<|6a֩5jtG}ܓNVvS7L|tsu4Zo==~9oȨP1ZR-.Vj5 1&Ƨ&. +uu^̥iVE2Ke9f"" v~CP2n1Qb(@@6+O;5qI x_0Rִ;kvGzv"sG^;Med~ggo1`ܚy Z68*`k;\"/[-nbEȭIIBdi/6>~r MYl΋8sz55ͬʴ=7NÇ~C"ۢ{nfK;FwDURI$LGwFP8/:V*:3z}g6pW:|b'rWYV-*HH! xfI6fI7%$NJMHjL'I$DHRNbBeG"쀞uYuY\Jk:C+_Qlx55LoBՀDVukwFV?=z랻Ii&R(_F[IC˗?w\Ν[t ?=g/LF?U".n[d EY  !d0DV5 pY&QSb+FW,ƹ + > >)z뙺@Onzl,|{7;O|ySS_-%ܿxɪOvfyr]߇%*qeWQeǜ:Yq +Nɫ v)dp{2 wO!8qZ$_Q&bde&A2ɦ +SIh485BYkj|5,&(L `RSf)⾓='G%'{oWn:rI +Ɉ8?zWYŢwKN$zޮI( 26s:8ޱS<&UY6 c=)mt7:m6+Vqiiܢ{Ҹi$mźsVV̓rnTkYS*o~QO^idysyqI9 [Ԛo@0i +N Yt~,\RS.]׽-ѓt*1CN o{+*ζǵ$@0m*OE“gFW#t>Mς#@ +CKcpY!`dIhhXRhH,)Ó)2Qxvr8r#{\V'9ItO9F⺗vFiCY&$h]Vj&XW[ۭǬԪVNVjew,^-?לNN\5t:"v_C`.轛qGГܪ?UOn{_꥞Nfizz8I愌vvcH ¤pә"%=CF 7%ܓ5cOhв0 $Wb.7O12 \o^dK̕yfA{T&s! +Pk&;Ż+owwWdCޭ=/=^eO_&{s! +PU%dw;^*ܵVnֹSf^3/خyW2',2C&2_&/N%sH jQ%oXmc|fklYKaRW0 r"q3ܗ|Ã|tvmnAշD#)/RFG\¾H"Y;vޒ̍AF{*8up_o7< !ndp#'=OF!^2 +N-_3:C +'dr, (Stƌ@fKL=sS&:=[IL>''qI$.))٠ j\n\m'WD6\cVѬ` PDK㒓X7yE2Xgk9!;dWF=xn;g#+E +;YT댤ЭFopϙ .^qS肳4v%(A Jй!OP*q+A WߜoC,A2j~ JP0.A:2^x}J>go`Ha&@ $@ p`n9kH 0,0>gY?2@ $@ $Ck;H#~x0@ u $𯇡^CGi&pVDH oJs3]cؿ}%@ $G"%6k>k +endstream +endobj +3014 0 obj +<< +/Filter /FlateDecode +/Length 6587 +/Length1 15048 +>> +stream +x tTdL$ Iɐ H&#3! Y)H APjje@:bDKZۺk+ָH2'a~|No{߽}&0tBڜY<|)BM+;tqjK,*ftrkDzLe >~Jvmkilɝ @B0єJ@ym+.>FN&ߊUM?j \xqG=p W$@W:qwiH|I:O 60D d*̃!鋠QSG4@'ddPsj5?4-}&zgۮqܗwɼn3#XVu +HyR0`Tsk6VA fh4d/h\gԖ'qGmjya4AZK`)r:` FbF1=}Ӵ&hcpy욂6Į5 sbZk8aLZcV `4B'xLnk)D  r!8c.,&XԻ ~MaMq/S@R5С+V B) Xˠ 'Ts@3LPtӷ/EA:NᗦLS kZ֡]=o_/~fX8O+6DhREBn D3u;ԠOu/{5=:>J4SPCǴ%h/Dkº5sߨbuǯˠͰbX +=p\?~ +w5plkV n-p3p`Dax {viSc° v< +<W$8 s0W +'Ϻ[}ޑsp_Se=?ŸUx ^7Mxޅ?{>|'Ssr VґXY6 Q$"Yd2L!EHH6- z`+lG  7~wp_~aH/>{Զc߫' x`x?z~m}* _%5jރ3zGo?To[T<>R/opNB>!8w| 'a Ө)HL{ץNm#:z18bU"n!O$RDfY$ɤrRAfYd!jF:HYKz麼R =>8dt=49я!٠Y7sg_>I= xC49dwu jT͝3{̪reEyYdӦM<0g7{\U÷4Qz +WQ|b@jRm]+ͮ% +)#bW +-_P,jx$Xu÷^4, +1 >Gѧl:%~7ȒFIroc$ڽ 2ͽRm`KFzxMf/(fQ(Ȗ>R[k,)塲`ydKM`Sc)< /i~ Ljz^@zWF58G)B1>G)8ovMJ͆`[o(W$*ԣPQ4*M#T2"_zoH"ߐzCRobEpjxb$]pv ݊Ӡ=Ŕg?!Et75z@]5xf6H3S1yS<|.B]6Jr+A%XT]*Xѧct`o.LG1{6sLY +0ƥxuI8Ei)$jFjvaLKM@Ѧ?fW&fi<Y1MP L~mףcjhs,bG1ѕ ѣX<3y]gbV>Ƌ|b=dP٨t/쑦 g6 +x<3gA$ztÛ-w>1s#EYl㹱V5h _F눋Vo_zh[ak9Vhն׶u_~1j[{|{>dC}oOd 4`&B~pG! ~nc8@. +r0ϩc\z[nnvUCSC%"@|QγHΫ p %CmAO*8JRaA~رh锇' 5E i}޸Kg4M^iqiĻ:חZǗG&7Z6MtޜW6xgbzݞpdP΃>B}}J£3 զZO7%c #CyIrjCǦg8 +IxtcGbbAtM_ݿzգ3OaYUK$.xIyv3K)ݿ͑UXlM@aNU]$B4a+B"EĤMY-HBbMBt^!ya~%%ECy.6JLr84Z?i#=]k^俪uܴceweM]\~M>orUρW\j6O\J-X7GjǦQ-hm B&,ö튋KLm +$av|g)֡8S|iO3ꀣ(7/7c J8i0 O `sY.h-鮨зr]lj8y,tVrTZy^Ҙx6nx:wS.oa֥\`v5Bx 񂐚o:!s\B~ As%XwG|QNQ@#:}>7[CNp;$=Kxm CTc{omd8=وp' MgVرSάcg9>z&Lgsg%'gC'8p`d 6HEAcbF|j/R׻:f%;{|^3As/}gl.<ԩMU1VȫiCIfeߌ|j\'іY0y]2;*֜> 7fPGm?τNuhmbc`50C !֧tb}IIf^ ΁ӣ$oel:M2ܹlRgWM%sO&CCWUOt[ܘ1,l2>Fj^Нcۑl#K3Mf)-NC491ӜQ Tc?4x~DݔK2{c2_щ|3ּPvŴx>"d䘅 {th߁G[yݯQs(̧JLkqV;Ǚ5&YNK8V9GC~ctKWgX6wykehֵ,4}/!+Gd5_{ >|3&w|UaZZaqĴ2Y +2(dpƸ̪B~'pU QpZ\G;A:ci,BdVL^uY; w; ۡ^z++@@@SS7hD/fz9r <A>3f G7A埂n\ Bthpsi]~/\e L7t(a;x^ n + UJO/f ^mzPN>A~S_nD=?ӋSuOשYvvuu5 i)[m[mk65y5X('D/VOG^[,בomsD%jn%!|oM]_'2oi/B/ y/]Ag. &ޕ7YEp[aQb: TY:T2YV HRd:r>2 #Ed22 )D&"H>"9ȄpjP/d!Ld#DA )g ~}Ƚ=]ϐ;"; ;ȏ!w #!" 7#7!?DnDn@'Wن\\\lEz+-f +,\"~F6!C6"K%ȺpҜS"d-҅t"kH +Y@#ˑ6dҊ Hi '֟Z!d Ҁ,B @.@"uȂpBөWGjh#QSoN8>Bf"U DF* +<;ʐRħ~#%t|d2)F)ddRLD +|$Er FH&2@r"!c7"" ICRąA'$" hd8;" 6Ċ!?F 1"D-A(BE!AfN +2R Afdv\}!sAf}&SAf2XG>d6 Afd dAfd w--Afo +2{C^d ? 2 ?2{E,%AfdvDً~+Af9=k6?{gO)gٓ6?{g!=n6?{gmQ[);`Gl~gl~,b_lnYg}X؃6[}vcm`w[]3k~jm`; '[؏ GvG\;=nkgĵMqqƸvvC\;>]ήkg,9%j%*2DHeR5JJ +D})\P!lKٞ`nE}.}D2[eߘoLx7}cdM'/IΐSq;5!gY\&&QI񉲒؟H!5G2O#\Ϯvjw{W&PDX%D lOT, 6f96]o[blmQ#Dm@ȵ kv?[1V/RSϾzEEE>BQ^8תpWCjl%6ؑZtkOkԲ`gŝY;f3?άήYkmgWVWgd7?]YY8z52|.tC Lg;7+ 2Y +endstream +endobj +3015 0 obj +<< +/BBox [22 30 2061 1804] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2919 3034 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2919 SCN/P2919 scn +22 30 2039 1774 re +f* + +endstream +endobj +3016 0 obj +<< +/BBox [22 30 2061 1804] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2924 3035 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2924 SCN/P2924 scn +22 30 2039 1774 re +f* + +endstream +endobj +3017 0 obj +<< +/BBox [22 30 2061 1804] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2929 3036 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2929 SCN/P2929 scn +22 30 2039 1774 re +f* + +endstream +endobj +3018 0 obj +<< +/BBox [22 30 2061 1804] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2934 3037 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2934 SCN/P2934 scn +22 30 2039 1774 re +f* + +endstream +endobj +3019 0 obj +<< +/BBox [22 30 2061 1804] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2939 3038 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2939 SCN/P2939 scn +22 30 2039 1774 re +f* + +endstream +endobj +3020 0 obj +<< +/BBox [22 30 2061 1804] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2944 3039 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2944 SCN/P2944 scn +22 30 2039 1774 re +f* + +endstream +endobj +3021 0 obj +<< +/BBox [28 32 2046 2050] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2952 3040 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2952 SCN/P2952 scn +28 32 2018 2018 re +f* + +endstream +endobj +3022 0 obj +<< +/BBox [28 32 2046 2050] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2957 3041 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2957 SCN/P2957 scn +28 32 2018 2018 re +f* + +endstream +endobj +3023 0 obj +<< +/BBox [28 32 2046 2050] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2962 3042 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2962 SCN/P2962 scn +28 32 2018 2018 re +f* + +endstream +endobj +3024 0 obj +<< +/BBox [28 32 2046 2050] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2967 3043 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2967 SCN/P2967 scn +28 32 2018 2018 re +f* + +endstream +endobj +3025 0 obj +<< +/BBox [28 32 2046 2050] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2972 3044 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2972 SCN/P2972 scn +28 32 2018 2018 re +f* + +endstream +endobj +3026 0 obj +<< +/BBox [28 32 2046 2050] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2977 3045 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2977 SCN/P2977 scn +28 32 2018 2018 re +f* + +endstream +endobj +3027 0 obj +<< +/BBox [40 32 2055 2046] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2985 3046 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2985 SCN/P2985 scn +40 32 2015 2014 re +f* + +endstream +endobj +3028 0 obj +<< +/BBox [40 32 2055 2046] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2990 3047 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2990 SCN/P2990 scn +40 32 2015 2014 re +f* + +endstream +endobj +3029 0 obj +<< +/BBox [40 32 2055 2046] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P2995 3048 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P2995 SCN/P2995 scn +40 32 2015 2014 re +f* + +endstream +endobj +3030 0 obj +<< +/BBox [40 32 2055 2046] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P3000 3049 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P3000 SCN/P3000 scn +40 32 2015 2014 re +f* + +endstream +endobj +3031 0 obj +<< +/BBox [40 32 2055 2046] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P3005 3050 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P3005 SCN/P3005 scn +40 32 2015 2014 re +f* + +endstream +endobj +3032 0 obj +<< +/BBox [40 32 2055 2046] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P3010 3051 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P3010 SCN/P3010 scn +40 32 2015 2014 re +f* + +endstream +endobj +3033 0 obj +<< +/BBox [40 32 2055 2046] +/Group << +/CS /DeviceRGB +/I true +/S /Transparency +/Type /Group +>> +/Length 65 +/Resources << +/Pattern << +/P3015 3052 0 R +>> +/ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +/Subtype /Form +/Type /XObject +>> +stream +/Pattern CS/Pattern cs/P3015 SCN/P3015 scn +40 32 2015 2014 re +f* + +endstream +endobj +3034 0 obj +<< +/Matrix [2048 0 0 2048 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.68652344 0.107185483 0.68652344 0.140136719] +/Extend [true true] +/Function << +/C0 [0 0 0] +/C1 [1 1 1] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3035 0 obj +<< +/Matrix [1322.09375 -1221.5 1389.8125 1504.25 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.055175781 0.22021484 0 0.055175781 0.22021484 0.072498322] +/Extend [true true] +/Function << +/C0 [1 1 1] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3036 0 obj +<< +/Matrix [2048 0 0 2048 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.51715827 -0.41607392 0.48547289 -0.43429303] +/Extend [true true] +/Function << +/Bounds [0.99999994] +/Domain [0 1] +/Encode [0 1 0 1] +/Functions [<< +/C0 [0 0 0] +/C1 [1 1 1] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [1 1 1] +/C1 [1 1 1] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3037 0 obj +<< +/Matrix [606.3125 1694.8125 -1928.3125 689.84375 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [-0.54394531 -0.87646484 0.0092207491 -0.54394531 -0.87646484 0.052244902] +/Extend [true true] +/Function << +/C0 [1 1 1] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3038 0 obj +<< +/Matrix [2048 0 0 2048 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.87006438 -0.39392689 0.89661062 -0.40923685] +/Extend [true true] +/Function << +/Bounds [0.99999994] +/Domain [0 1] +/Encode [0 1 0 1] +/Functions [<< +/C0 [0 0 0] +/C1 [1 1 1] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [1 1 1] +/C1 [1 1 1] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3039 0 obj +<< +/Matrix [-710 -1654.0625 -1881.9375 807.8125 -369 1517] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [-0.68359375 -1.06542969 0.022556543 -0.68359375 -1.06542969 0.072265625] +/Extend [true true] +/Function << +/C0 [1 1 1] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3040 0 obj +<< +/Matrix [-1239.875 1239.875 1448.15625 1448.15625 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [-1.58496094 0.23632813 0 -1.58496094 0.23632813 0.145507813] +/Extend [true true] +/Function << +/C0 [0.6 0.6 0.6] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3041 0 obj +<< +/Matrix [1331.3125 -1141.125 1332.8125 1554.96875 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.123535156 0.22900391 0 0.123535156 0.22900391 0.18945313] +/Extend [true true] +/Function << +/C0 [0.7 0.7 0.7] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3042 0 obj +<< +/Matrix [2048 0 0 2048 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [1.17919922 -0.35253906 1.02099609 -0.35253906] +/Extend [true true] +/Function << +/Bounds [0.47918701] +/Domain [0 1] +/Encode [0 1 0 1] +/Functions [<< +/C0 [0 0 0] +/C1 [0.3 0.3 0.3] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.3 0.3 0.3] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3043 0 obj +<< +/Matrix [2048 0 0 2048 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.68652344 -0.84521484 0.68652344 -0.70458984] +/Extend [true true] +/Function << +/Bounds [0.47918701] +/Domain [0 1] +/Encode [0 1 0 1] +/Functions [<< +/C0 [0 0 0] +/C1 [0.4 0.4 0.4] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.4 0.4 0.4] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3044 0 obj +<< +/Matrix [2048 0 0 2048 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.68652344 -0.84521484 0.68652344 0.140136719] +/Extend [true true] +/Function << +/Bounds [0.058288574 0.87219238 0.93945313] +/Domain [0 1] +/Encode [0 1 0 1 0 1 0 1] +/Functions [<< +/C0 [0.35 0.35 0.35] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0 0 0] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0 0 0] +/C1 [0.4386 0.4386 0.4386] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.4386 0.4386 0.4386] +/C1 [1 1 1] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3045 0 obj +<< +/Matrix [2048 0 0 2048 -369 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [1.17578125 -0.36132813 0.20361328 -0.36132813] +/Extend [true true] +/Function << +/Bounds [0.058288574 0.87219238 0.93945313] +/Domain [0 1] +/Encode [0 1 0 1 0 1 0 1] +/Functions [<< +/C0 [0.35 0.35 0.35] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0 0 0] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0 0 0] +/C1 [0.4386 0.4386 0.4386] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.4386 0.4386 0.4386] +/C1 [1 1 1] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3046 0 obj +<< +/Matrix [2048 0 0 2048 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.35839844 -0.69238281 0.65429527 -0.39453286] +/Extend [true true] +/Function << +/C0 [1 1 1] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3047 0 obj +<< +/Matrix [2048 0 0 2048 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.78857422 -0.6015625 0.94067383 -0.44995198] +/Extend [true true] +/Function << +/Bounds [0.17614746 0.50604248 0.84680176] +/Domain [0 1] +/Encode [0 1 0 1 0 1 0 1] +/Functions [<< +/C0 [0 0 0] +/C1 [0.5015 0.5015 0.5015] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.5015 0.5015 0.5015] +/C1 [1 1 1] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [1 1 1] +/C1 [0.4578 0.4578 0.4578] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.4578 0.4578 0.4578] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3048 0 obj +<< +/Matrix [2048 0 0 2048 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.56689453 -0.62744141 0.41674805 -0.47729492] +/Extend [true true] +/Function << +/Bounds [0.109863281 0.37359619 0.84680176] +/Domain [0 1] +/Encode [0 1 0 1 0 1 0 1] +/Functions [<< +/C0 [0 0 0] +/C1 [0.5015 0.5015 0.5015] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.5015 0.5015 0.5015] +/C1 [1 1 1] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [1 1 1] +/C1 [0.4578 0.4578 0.4578] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> << +/C0 [0.4578 0.4578 0.4578] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>>] +/FunctionType 3 +>> +/ShadingType 2 +>> +/Type /Pattern +>> +endobj +3049 0 obj +<< +/Matrix [1434.28125 1461.875 -1461.875 1434.28125 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.88232422 -0.75097656 0 0.88232422 -0.75097656 0.163085938] +/Extend [true true] +/Function << +/C0 [0.7 0.7 0.7] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3050 0 obj +<< +/Matrix [-1363.40625 1528.21875 1528.21875 1363.40625 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [-0.077148438 0.24414063 0 -0.077148438 0.24414063 0.150390625] +/Extend [true true] +/Function << +/C0 [0.8 0.8 0.8] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3051 0 obj +<< +/Matrix [-1579.75 -1303.3125 -1303.3125 1579.75 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [0.33837891 -0.77392578 0 0.33837891 -0.77392578 0.114257813] +/Extend [true true] +/Function << +/C0 [1 1 1] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +3052 0 obj +<< +/Matrix [1448.15625 -1448.15625 1448.15625 1448.15625 -369.07202 1763] +/PatternType 2 +/Shading << +/ColorSpace /DeviceRGB +/Coords [1.390625 0.24316406 0 1.390625 0.24316406 0.102539063] +/Extend [true true] +/Function << +/C0 [1 1 1] +/C1 [0 0 0] +/Domain [0 1] +/FunctionType 2 +/N 1 +>> +/ShadingType 3 +>> +/Type /Pattern +>> +endobj +xref +0 3053 +0000000000 65535 f +0000000015 00000 n +0000000308 00000 n +0000000526 00000 n +0000003787 00000 n +0000003851 00000 n +0000003958 00000 n +0000004079 00000 n +0000004179 00000 n +0000004215 00000 n +0000005684 00000 n +0000005865 00000 n +0000006159 00000 n +0000006441 00000 n +0000006709 00000 n +0000006978 00000 n +0000007234 00000 n +0000007503 00000 n +0000007798 00000 n +0000008067 00000 n +0000008348 00000 n +0000008617 00000 n +0000008874 00000 n +0000009144 00000 n +0000009402 00000 n +0000010876 00000 n +0000010958 00000 n +0000011048 00000 n +0000011127 00000 n +0000011209 00000 n +0000011333 00000 n +0000011412 00000 n +0000011494 00000 n +0000011561 00000 n +0000011805 00000 n +0000011872 00000 n +0000012006 00000 n +0000012073 00000 n +0000012275 00000 n +0000012342 00000 n +0000012418 00000 n +0000012507 00000 n +0000012583 00000 n +0000012672 00000 n +0000012748 00000 n +0000012837 00000 n +0000012913 00000 n +0000013003 00000 n +0000013083 00000 n +0000013166 00000 n +0000013243 00000 n +0000013327 00000 n +0000013394 00000 n +0000013580 00000 n +0000013647 00000 n +0000013755 00000 n +0000013822 00000 n +0000013888 00000 n +0000014062 00000 n +0000014153 00000 n +0000014220 00000 n +0000014358 00000 n +0000014437 00000 n +0000014519 00000 n +0000014586 00000 n +0000014652 00000 n +0000014718 00000 n +0000014852 00000 n +0000014919 00000 n +0000015003 00000 n +0000015113 00000 n +0000015253 00000 n +0000015425 00000 n +0000015492 00000 n +0000015710 00000 n +0000015777 00000 n +0000015895 00000 n +0000015975 00000 n +0000016058 00000 n +0000016142 00000 n +0000016209 00000 n +0000016335 00000 n +0000016402 00000 n +0000016492 00000 n +0000016559 00000 n +0000016651 00000 n +0000016730 00000 n +0000016812 00000 n +0000016879 00000 n +0000016979 00000 n +0000017068 00000 n +0000017135 00000 n +0000017201 00000 n +0000017280 00000 n +0000017362 00000 n +0000017429 00000 n +0000017496 00000 n +0000017636 00000 n +0000017712 00000 n +0000017779 00000 n +0000017903 00000 n +0000017993 00000 n +0000018070 00000 n +0000018138 00000 n +0000018263 00000 n +0000018364 00000 n +0000018432 00000 n +0000018589 00000 n +0000018666 00000 n +0000018756 00000 n +0000018847 00000 n +0000018925 00000 n +0000018992 00000 n +0000019060 00000 n +0000019128 00000 n +0000019245 00000 n +0000019313 00000 n +0000019438 00000 n +0000019506 00000 n +0000019615 00000 n +0000019683 00000 n +0000019792 00000 n +0000019869 00000 n +0000019947 00000 n +0000020014 00000 n +0000020082 00000 n +0000020168 00000 n +0000020245 00000 n +0000020313 00000 n +0000020486 00000 n +0000020554 00000 n +0000020663 00000 n +0000020743 00000 n +0000020826 00000 n +0000020894 00000 n +0000021020 00000 n +0000021088 00000 n +0000021156 00000 n +0000021281 00000 n +0000021371 00000 n +0000021439 00000 n +0000021580 00000 n +0000021670 00000 n +0000021738 00000 n +0000021863 00000 n +0000021953 00000 n +0000022021 00000 n +0000022162 00000 n +0000022253 00000 n +0000022321 00000 n +0000022398 00000 n +0000022507 00000 n +0000022597 00000 n +0000022664 00000 n +0000022731 00000 n +0000022849 00000 n +0000022926 00000 n +0000022993 00000 n +0000023102 00000 n +0000023192 00000 n +0000023259 00000 n +0000023326 00000 n +0000023411 00000 n +0000023537 00000 n +0000023638 00000 n +0000023705 00000 n +0000023782 00000 n +0000023872 00000 n +0000023939 00000 n +0000024006 00000 n +0000024074 00000 n +0000024231 00000 n +0000024299 00000 n +0000024457 00000 n +0000024538 00000 n +0000024622 00000 n +0000024690 00000 n +0000024758 00000 n +0000024843 00000 n +0000024911 00000 n +0000025012 00000 n +0000025080 00000 n +0000025165 00000 n +0000025233 00000 n +0000025374 00000 n +0000025442 00000 n +0000025535 00000 n +0000025603 00000 n +0000025721 00000 n +0000025801 00000 n +0000025884 00000 n +0000025952 00000 n +0000026071 00000 n +0000026139 00000 n +0000026282 00000 n +0000026350 00000 n +0000026521 00000 n +0000026589 00000 n +0000026708 00000 n +0000026789 00000 n +0000026873 00000 n +0000026941 00000 n +0000027032 00000 n +0000027100 00000 n +0000027191 00000 n +0000027259 00000 n +0000027349 00000 n +0000027417 00000 n +0000027507 00000 n +0000028726 00000 n +0000031459 00000 n +0000033140 00000 n +0000034697 00000 n +0000036705 00000 n +0000037673 00000 n +0000038813 00000 n +0000040015 00000 n +0000041266 00000 n +0000042652 00000 n +0000043941 00000 n +0000044355 00000 n +0000046224 00000 n +0000046631 00000 n +0000047041 00000 n +0000054575 00000 n +0000054616 00000 n +0000054772 00000 n +0000054924 00000 n +0000056452 00000 n +0000056600 00000 n +0000066784 00000 n +0000066932 00000 n +0000067088 00000 n +0000082032 00000 n +0000094679 00000 n +0000104139 00000 n +0000111638 00000 n +0000121081 00000 n +0000122020 00000 n +0000122173 00000 n +0000128961 00000 n +0000136993 00000 n +0000144750 00000 n +0000153171 00000 n +0000156688 00000 n +0000160398 00000 n +0000160592 00000 n +0000160786 00000 n +0000160980 00000 n +0000161174 00000 n +0000161369 00000 n +0000161600 00000 n +0000161831 00000 n +0000162062 00000 n +0000162293 00000 n +0000162525 00000 n +0000162757 00000 n +0000162989 00000 n +0000163221 00000 n +0000163416 00000 n +0000163611 00000 n +0000163807 00000 n +0000164039 00000 n +0000164271 00000 n +0000164503 00000 n +0000164698 00000 n +0000164893 00000 n +0000165088 00000 n +0000165284 00000 n +0000165480 00000 n +0000165676 00000 n +0000165872 00000 n +0000166104 00000 n +0000166336 00000 n +0000166568 00000 n +0000166800 00000 n +0000166995 00000 n +0000167190 00000 n +0000167385 00000 n +0000167581 00000 n +0000167777 00000 n +0000167973 00000 n +0000168168 00000 n +0000168363 00000 n +0000168558 00000 n +0000168753 00000 n +0000168948 00000 n +0000169143 00000 n +0000169338 00000 n +0000169533 00000 n +0000169728 00000 n +0000169923 00000 n +0000170118 00000 n +0000170313 00000 n +0000170508 00000 n +0000170703 00000 n +0000170898 00000 n +0000171094 00000 n +0000171290 00000 n +0000171486 00000 n +0000171682 00000 n +0000171878 00000 n +0000172110 00000 n +0000172342 00000 n +0000172574 00000 n +0000172769 00000 n +0000172964 00000 n +0000173046 00000 n +0000173176 00000 n +0000173258 00000 n +0000173338 00000 n +0000173418 00000 n +0000173498 00000 n +0000173578 00000 n +0000173658 00000 n +0000173738 00000 n +0000173818 00000 n +0000173898 00000 n +0000173980 00000 n +0000174062 00000 n +0000174144 00000 n +0000174217 00000 n +0000174299 00000 n +0000174372 00000 n +0000174454 00000 n +0000174527 00000 n +0000174609 00000 n +0000174682 00000 n +0000174764 00000 n +0000174837 00000 n +0000174919 00000 n +0000174992 00000 n +0000175074 00000 n +0000175147 00000 n +0000175229 00000 n +0000175302 00000 n +0000175384 00000 n +0000175457 00000 n +0000175539 00000 n +0000175612 00000 n +0000175694 00000 n +0000175767 00000 n +0000175849 00000 n +0000175931 00000 n +0000176034 00000 n +0000176142 00000 n +0000176264 00000 n +0000176372 00000 n +0000176494 00000 n +0000176602 00000 n +0000176724 00000 n +0000176807 00000 n +0000176902 00000 n +0000177001 00000 n +0000177114 00000 n +0000177213 00000 n +0000177326 00000 n +0000177425 00000 n +0000177538 00000 n +0000177637 00000 n +0000177749 00000 n +0000177848 00000 n +0000177960 00000 n +0000178042 00000 n +0000178129 00000 n +0000178211 00000 n +0000179409 00000 n +0000179498 00000 n +0000179581 00000 n +0000179997 00000 n +0000180086 00000 n +0000180169 00000 n +0000180558 00000 n +0000180647 00000 n +0000180730 00000 n +0000181029 00000 n +0000181112 00000 n +0000181195 00000 n +0000181269 00000 n +0000181352 00000 n +0000181426 00000 n +0000181509 00000 n +0000181592 00000 n +0000181687 00000 n +0000181786 00000 n +0000181899 00000 n +0000181998 00000 n +0000182110 00000 n +0000182209 00000 n +0000182321 00000 n +0000182420 00000 n +0000182532 00000 n +0000182614 00000 n +0000182704 00000 n +0000182884 00000 n +0000183001 00000 n +0000183091 00000 n +0000183181 00000 n +0000183289 00000 n +0000183372 00000 n +0000183455 00000 n +0000183542 00000 n +0000183632 00000 n +0000183736 00000 n +0000183826 00000 n +0000183930 00000 n +0000184020 00000 n +0000184124 00000 n +0000184214 00000 n +0000184318 00000 n +0000184408 00000 n +0000184512 00000 n +0000184602 00000 n +0000184736 00000 n +0000184819 00000 n +0000184906 00000 n +0000184996 00000 n +0000185099 00000 n +0000185181 00000 n +0000185263 00000 n +0000185337 00000 n +0000185419 00000 n +0000185506 00000 n +0000185596 00000 n +0000185700 00000 n +0000185790 00000 n +0000185894 00000 n +0000185984 00000 n +0000186088 00000 n +0000186170 00000 n +0000186252 00000 n +0000186326 00000 n +0000186408 00000 n +0000186503 00000 n +0000186602 00000 n +0000186715 00000 n +0000186814 00000 n +0000186888 00000 n +0000186970 00000 n +0000187044 00000 n +0000187127 00000 n +0000187216 00000 n +0000187299 00000 n +0000187388 00000 n +0000187471 00000 n +0000187560 00000 n +0000187643 00000 n +0000187717 00000 n +0000187800 00000 n +0000187889 00000 n +0000187972 00000 n +0000188061 00000 n +0000188144 00000 n +0000188233 00000 n +0000188316 00000 n +0000188405 00000 n +0000188488 00000 n +0000188577 00000 n +0000188660 00000 n +0000188753 00000 n +0000188836 00000 n +0000188919 00000 n +0000189014 00000 n +0000189113 00000 n +0000189226 00000 n +0000189325 00000 n +0000189438 00000 n +0000189537 00000 n +0000189650 00000 n +0000189749 00000 n +0000189862 00000 n +0000189961 00000 n +0000190073 00000 n +0000190172 00000 n +0000190284 00000 n +0000190366 00000 n +0000190453 00000 n +0000190543 00000 n +0000190647 00000 n +0000190737 00000 n +0000190841 00000 n +0000190923 00000 n +0000191005 00000 n +0000191093 00000 n +0000191175 00000 n +0000191257 00000 n +0000191353 00000 n +0000191443 00000 n +0000191547 00000 n +0000191637 00000 n +0000191741 00000 n +0000191831 00000 n +0000191913 00000 n +0000192968 00000 n +0000193051 00000 n +0000193141 00000 n +0000193258 00000 n +0000193339 00000 n +0000193429 00000 n +0000193510 00000 n +0000193591 00000 n +0000193672 00000 n +0000193759 00000 n +0000193841 00000 n +0000193929 00000 n +0000194011 00000 n +0000194083 00000 n +0000194165 00000 n +0000194247 00000 n +0000194329 00000 n +0000194411 00000 n +0000194493 00000 n +0000194567 00000 n +0000194649 00000 n +0000194723 00000 n +0000194805 00000 n +0000194893 00000 n +0000194975 00000 n +0000195063 00000 n +0000195145 00000 n +0000195233 00000 n +0000195315 00000 n +0000195389 00000 n +0000195471 00000 n +0000195553 00000 n +0000195627 00000 n +0000195709 00000 n +0000195783 00000 n +0000195865 00000 n +0000195953 00000 n +0000196035 00000 n +0000196109 00000 n +0000196191 00000 n +0000196662 00000 n +0000196737 00000 n +0000196820 00000 n +0000196903 00000 n +0000196978 00000 n +0000197061 00000 n +0000197136 00000 n +0000197219 00000 n +0000197308 00000 n +0000197392 00000 n +0000197482 00000 n +0000197566 00000 n +0000197641 00000 n +0000197725 00000 n +0000197815 00000 n +0000197899 00000 n +0000197989 00000 n +0000198071 00000 n +0000198146 00000 n +0000198228 00000 n +0000198303 00000 n +0000198385 00000 n +0000198473 00000 n +0000198556 00000 n +0000198645 00000 n +0000198728 00000 n +0000198817 00000 n +0000198900 00000 n +0000198989 00000 n +0000199072 00000 n +0000199147 00000 n +0000199230 00000 n +0000199548 00000 n +0000199618 00000 n +0000199701 00000 n +0000199776 00000 n +0000199859 00000 n +0000199942 00000 n +0000200025 00000 n +0000200100 00000 n +0000200183 00000 n +0000200258 00000 n +0000200341 00000 n +0000200430 00000 n +0000200513 00000 n +0000200602 00000 n +0000200685 00000 n +0000200760 00000 n +0000200843 00000 n +0000200918 00000 n +0000201001 00000 n +0000201090 00000 n +0000201173 00000 n +0000201262 00000 n +0000201345 00000 n +0000201428 00000 n +0000201503 00000 n +0000201586 00000 n +0000201661 00000 n +0000201744 00000 n +0000201833 00000 n +0000201916 00000 n +0000201999 00000 n +0000202074 00000 n +0000202157 00000 n +0000202232 00000 n +0000202315 00000 n +0000202404 00000 n +0000202487 00000 n +0000202562 00000 n +0000202645 00000 n +0000202728 00000 n +0000202803 00000 n +0000202886 00000 n +0000202969 00000 n +0000203052 00000 n +0000203141 00000 n +0000203225 00000 n +0000203300 00000 n +0000203384 00000 n +0000203468 00000 n +0000203543 00000 n +0000203627 00000 n +0000203702 00000 n +0000203786 00000 n +0000203876 00000 n +0000203960 00000 n +0000204050 00000 n +0000204134 00000 n +0000204224 00000 n +0000204308 00000 n +0000204398 00000 n +0000204482 00000 n +0000204572 00000 n +0000204656 00000 n +0000204740 00000 n +0000204815 00000 n +0000204899 00000 n +0000204974 00000 n +0000205058 00000 n +0000205148 00000 n +0000205232 00000 n +0000205315 00000 n +0000205398 00000 n +0000205486 00000 n +0000205577 00000 n +0000205681 00000 n +0000205772 00000 n +0000205876 00000 n +0000205967 00000 n +0000206050 00000 n +0000206133 00000 n +0000206208 00000 n +0000206291 00000 n +0000206366 00000 n +0000206449 00000 n +0000206524 00000 n +0000206607 00000 n +0000206696 00000 n +0000206779 00000 n +0000206890 00000 n +0000206973 00000 n +0000207048 00000 n +0000207131 00000 n +0000207206 00000 n +0000207289 00000 n +0000207378 00000 n +0000207461 00000 n +0000207536 00000 n +0000207619 00000 n +0000207708 00000 n +0000207791 00000 n +0000207920 00000 n +0000208003 00000 n +0000208078 00000 n +0000208161 00000 n +0000208236 00000 n +0000208319 00000 n +0000208408 00000 n +0000208491 00000 n +0000208566 00000 n +0000208649 00000 n +0000209084 00000 n +0000209168 00000 n +0000209243 00000 n +0000209327 00000 n +0000209402 00000 n +0000209486 00000 n +0000209576 00000 n +0000209660 00000 n +0000209735 00000 n +0000209819 00000 n +0000209894 00000 n +0000209978 00000 n +0000210098 00000 n +0000210181 00000 n +0000210256 00000 n +0000210339 00000 n +0000210414 00000 n +0000210497 00000 n +0000210586 00000 n +0000210669 00000 n +0000210758 00000 n +0000210841 00000 n +0000210914 00000 n +0000210989 00000 n +0000211064 00000 n +0000211160 00000 n +0000211260 00000 n +0000211373 00000 n +0000211473 00000 n +0000211586 00000 n +0000211661 00000 n +0000211744 00000 n +0000211819 00000 n +0000211908 00000 n +0000211991 00000 n +0000212080 00000 n +0000212163 00000 n +0000212252 00000 n +0000212335 00000 n +0000212545 00000 n +0000212628 00000 n +0000212703 00000 n +0000212786 00000 n +0000212875 00000 n +0000212958 00000 n +0000213591 00000 n +0000213674 00000 n +0000213763 00000 n +0000213846 00000 n +0000213921 00000 n +0000214004 00000 n +0000214079 00000 n +0000214168 00000 n +0000214251 00000 n +0000214866 00000 n +0000214949 00000 n +0000215032 00000 n +0000215115 00000 n +0000215190 00000 n +0000215273 00000 n +0000215348 00000 n +0000215431 00000 n +0000215506 00000 n +0000215589 00000 n +0000215678 00000 n +0000215762 00000 n +0000215837 00000 n +0000215921 00000 n +0000216011 00000 n +0000216095 00000 n +0000216179 00000 n +0000216267 00000 n +0000216358 00000 n +0000216462 00000 n +0000216553 00000 n +0000216657 00000 n +0000216748 00000 n +0000216852 00000 n +0000216943 00000 n +0000217047 00000 n +0000217138 00000 n +0000217222 00000 n +0000217306 00000 n +0000217390 00000 n +0000217474 00000 n +0000217564 00000 n +0000217648 00000 n +0000217732 00000 n +0000217816 00000 n +0000217906 00000 n +0000217990 00000 n +0000218080 00000 n +0000218164 00000 n +0000218248 00000 n +0000218332 00000 n +0000218422 00000 n +0000218506 00000 n +0000218589 00000 n +0000218678 00000 n +0000218761 00000 n +0000218850 00000 n +0000218933 00000 n +0000219022 00000 n +0000219105 00000 n +0000219194 00000 n +0000219277 00000 n +0000219366 00000 n +0000219449 00000 n +0000219532 00000 n +0000219641 00000 n +0000219750 00000 n +0000219841 00000 n +0000219977 00000 n +0000220060 00000 n +0000220148 00000 n +0000220239 00000 n +0000220343 00000 n +0000220434 00000 n +0000220538 00000 n +0000220621 00000 n +0000220704 00000 n +0000220800 00000 n +0000220900 00000 n +0000221014 00000 n +0000221114 00000 n +0000221228 00000 n +0000221312 00000 n +0000221400 00000 n +0000221491 00000 n +0000221596 00000 n +0000221687 00000 n +0000221792 00000 n +0000221883 00000 n +0000221988 00000 n +0000222079 00000 n +0000222163 00000 n +0000222251 00000 n +0000222342 00000 n +0000222447 00000 n +0000222538 00000 n +0000222642 00000 n +0000222733 00000 n +0000222837 00000 n +0000222920 00000 n +0000223000 00000 n +0000223082 00000 n +0000223177 00000 n +0000223259 00000 n +0000223354 00000 n +0000223437 00000 n +0000223520 00000 n +0000223593 00000 n +0000223676 00000 n +0000223749 00000 n +0000223831 00000 n +0000225220 00000 n +0000225304 00000 n +0000225865 00000 n +0000225949 00000 n +0000226032 00000 n +0000226116 00000 n +0000226199 00000 n +0000226283 00000 n +0000226366 00000 n +0000226450 00000 n +0000226533 00000 n +0000226610 00000 n +0000226694 00000 n +0000226771 00000 n +0000226855 00000 n +0000226932 00000 n +0000227016 00000 n +0000227093 00000 n +0000227177 00000 n +0000227254 00000 n +0000227338 00000 n +0000227415 00000 n +0000227499 00000 n +0000227576 00000 n +0000227660 00000 n +0000227737 00000 n +0000227821 00000 n +0000227904 00000 n +0000227987 00000 n +0000228070 00000 n +0000228153 00000 n +0000228236 00000 n +0000228319 00000 n +0000228402 00000 n +0000228485 00000 n +0000228568 00000 n +0000228651 00000 n +0000228734 00000 n +0000228817 00000 n +0000228900 00000 n +0000228983 00000 n +0000229066 00000 n +0000229149 00000 n +0000229238 00000 n +0000229321 00000 n +0000229405 00000 n +0000229489 00000 n +0000229573 00000 n +0000229657 00000 n +0000229746 00000 n +0000229829 00000 n +0000229913 00000 n +0000229997 00000 n +0000230081 00000 n +0000230165 00000 n +0000230254 00000 n +0000230337 00000 n +0000230421 00000 n +0000230505 00000 n +0000230589 00000 n +0000230673 00000 n +0000230762 00000 n +0000230845 00000 n +0000230930 00000 n +0000231015 00000 n +0000231100 00000 n +0000231185 00000 n +0000231275 00000 n +0000231359 00000 n +0000231444 00000 n +0000231529 00000 n +0000231614 00000 n +0000231699 00000 n +0000231789 00000 n +0000231873 00000 n +0000231958 00000 n +0000232043 00000 n +0000232128 00000 n +0000232213 00000 n +0000232336 00000 n +0000232459 00000 n +0000232582 00000 n +0000232705 00000 n +0000232795 00000 n +0000232879 00000 n +0000232964 00000 n +0000233049 00000 n +0000233134 00000 n +0000233224 00000 n +0000233308 00000 n +0000233393 00000 n +0000233478 00000 n +0000233563 00000 n +0000233653 00000 n +0000233737 00000 n +0000233822 00000 n +0000233907 00000 n +0000233992 00000 n +0000234082 00000 n +0000234166 00000 n +0000234251 00000 n +0000234336 00000 n +0000234421 00000 n +0000234511 00000 n +0000234595 00000 n +0000234680 00000 n +0000234765 00000 n +0000234850 00000 n +0000234940 00000 n +0000235024 00000 n +0000235109 00000 n +0000235194 00000 n +0000235279 00000 n +0000235368 00000 n +0000235451 00000 n +0000235535 00000 n +0000235619 00000 n +0000235703 00000 n +0000235792 00000 n +0000235875 00000 n +0000235959 00000 n +0000236043 00000 n +0000236127 00000 n +0000236216 00000 n +0000236299 00000 n +0000236383 00000 n +0000236467 00000 n +0000236551 00000 n +0000236640 00000 n +0000236723 00000 n +0000236807 00000 n +0000236891 00000 n +0000236975 00000 n +0000237058 00000 n +0000237141 00000 n +0000237224 00000 n +0000237307 00000 n +0000237390 00000 n +0000237473 00000 n +0000237556 00000 n +0000237639 00000 n +0000237722 00000 n +0000237805 00000 n +0000237888 00000 n +0000237971 00000 n +0000238054 00000 n +0000238137 00000 n +0000238220 00000 n +0000238303 00000 n +0000238386 00000 n +0000238469 00000 n +0000238552 00000 n +0000238635 00000 n +0000238718 00000 n +0000238801 00000 n +0000238884 00000 n +0000238967 00000 n +0000239050 00000 n +0000239133 00000 n +0000239216 00000 n +0000239299 00000 n +0000239382 00000 n +0000239465 00000 n +0000239548 00000 n +0000239631 00000 n +0000239714 00000 n +0000239797 00000 n +0000239880 00000 n +0000239963 00000 n +0000240046 00000 n +0000240129 00000 n +0000240213 00000 n +0000240297 00000 n +0000240381 00000 n +0000240465 00000 n +0000240549 00000 n +0000240633 00000 n +0000240717 00000 n +0000240801 00000 n +0000240885 00000 n +0000240969 00000 n +0000241053 00000 n +0000241137 00000 n +0000241221 00000 n +0000241305 00000 n +0000241389 00000 n +0000241473 00000 n +0000241558 00000 n +0000241643 00000 n +0000241728 00000 n +0000241813 00000 n +0000241898 00000 n +0000241983 00000 n +0000242068 00000 n +0000242153 00000 n +0000242238 00000 n +0000242323 00000 n +0000242408 00000 n +0000242493 00000 n +0000242578 00000 n +0000242663 00000 n +0000242748 00000 n +0000242833 00000 n +0000242918 00000 n +0000243003 00000 n +0000243088 00000 n +0000243173 00000 n +0000243258 00000 n +0000243343 00000 n +0000243428 00000 n +0000243513 00000 n +0000243598 00000 n +0000243683 00000 n +0000243768 00000 n +0000243853 00000 n +0000243938 00000 n +0000244023 00000 n +0000244108 00000 n +0000244193 00000 n +0000244278 00000 n +0000244363 00000 n +0000244448 00000 n +0000244533 00000 n +0000244618 00000 n +0000244703 00000 n +0000244788 00000 n +0000244873 00000 n +0000244958 00000 n +0000245043 00000 n +0000245128 00000 n +0000245213 00000 n +0000245298 00000 n +0000245383 00000 n +0000245468 00000 n +0000245553 00000 n +0000245638 00000 n +0000245723 00000 n +0000245808 00000 n +0000245893 00000 n +0000245978 00000 n +0000246063 00000 n +0000246148 00000 n +0000246233 00000 n +0000246318 00000 n +0000246403 00000 n +0000246488 00000 n +0000246573 00000 n +0000246658 00000 n +0000246743 00000 n +0000246828 00000 n +0000246913 00000 n +0000246998 00000 n +0000247083 00000 n +0000247168 00000 n +0000247253 00000 n +0000247338 00000 n +0000247423 00000 n +0000247508 00000 n +0000247593 00000 n +0000247678 00000 n +0000247763 00000 n +0000247848 00000 n +0000247933 00000 n +0000248018 00000 n +0000248103 00000 n +0000248188 00000 n +0000248273 00000 n +0000248358 00000 n +0000248443 00000 n +0000248528 00000 n +0000248613 00000 n +0000248698 00000 n +0000248783 00000 n +0000248868 00000 n +0000248953 00000 n +0000249038 00000 n +0000249123 00000 n +0000249208 00000 n +0000249293 00000 n +0000249378 00000 n +0000249463 00000 n +0000249548 00000 n +0000249633 00000 n +0000249718 00000 n +0000249803 00000 n +0000249888 00000 n +0000249973 00000 n +0000250058 00000 n +0000250143 00000 n +0000250228 00000 n +0000250313 00000 n +0000250398 00000 n +0000250483 00000 n +0000250568 00000 n +0000250653 00000 n +0000250738 00000 n +0000250823 00000 n +0000250908 00000 n +0000250993 00000 n +0000251078 00000 n +0000251163 00000 n +0000251248 00000 n +0000251333 00000 n +0000251418 00000 n +0000251503 00000 n +0000251588 00000 n +0000251673 00000 n +0000251758 00000 n +0000251843 00000 n +0000251928 00000 n +0000252013 00000 n +0000252098 00000 n +0000252183 00000 n +0000252268 00000 n +0000252353 00000 n +0000252438 00000 n +0000252523 00000 n +0000252608 00000 n +0000252693 00000 n +0000252778 00000 n +0000252863 00000 n +0000252948 00000 n +0000253033 00000 n +0000253118 00000 n +0000253203 00000 n +0000253288 00000 n +0000253373 00000 n +0000253458 00000 n +0000253543 00000 n +0000253628 00000 n +0000253713 00000 n +0000253798 00000 n +0000253883 00000 n +0000253968 00000 n +0000254053 00000 n +0000254138 00000 n +0000254223 00000 n +0000254308 00000 n +0000254393 00000 n +0000254478 00000 n +0000254563 00000 n +0000254648 00000 n +0000254733 00000 n +0000254818 00000 n +0000254903 00000 n +0000254988 00000 n +0000255073 00000 n +0000255158 00000 n +0000255243 00000 n +0000255328 00000 n +0000255413 00000 n +0000255498 00000 n +0000255583 00000 n +0000255668 00000 n +0000255753 00000 n +0000255838 00000 n +0000255923 00000 n +0000256008 00000 n +0000256093 00000 n +0000256178 00000 n +0000256263 00000 n +0000256348 00000 n +0000256433 00000 n +0000256518 00000 n +0000256603 00000 n +0000256688 00000 n +0000256773 00000 n +0000256858 00000 n +0000256943 00000 n +0000257028 00000 n +0000257152 00000 n +0000257276 00000 n +0000257400 00000 n +0000257524 00000 n +0000257616 00000 n +0000257702 00000 n +0000257788 00000 n +0000257874 00000 n +0000257960 00000 n +0000258046 00000 n +0000258132 00000 n +0000258224 00000 n +0000258310 00000 n +0000258396 00000 n +0000258488 00000 n +0000258574 00000 n +0000258660 00000 n +0000258746 00000 n +0000258832 00000 n +0000258923 00000 n +0000259008 00000 n +0000259093 00000 n +0000259178 00000 n +0000259263 00000 n +0000259354 00000 n +0000259439 00000 n +0000259524 00000 n +0000259609 00000 n +0000259694 00000 n +0000259785 00000 n +0000259870 00000 n +0000259955 00000 n +0000260040 00000 n +0000260125 00000 n +0000260216 00000 n +0000260301 00000 n +0000260386 00000 n +0000260477 00000 n +0000260562 00000 n +0000260647 00000 n +0000260732 00000 n +0000260817 00000 n +0000260908 00000 n +0000260993 00000 n +0000261078 00000 n +0000261169 00000 n +0000261254 00000 n +0000261339 00000 n +0000261424 00000 n +0000261509 00000 n +0000261600 00000 n +0000261685 00000 n +0000261770 00000 n +0000261861 00000 n +0000261946 00000 n +0000262031 00000 n +0000262116 00000 n +0000262201 00000 n +0000262279 00000 n +0000262364 00000 n +0000262448 00000 n +0000262526 00000 n +0000262611 00000 n +0000262695 00000 n +0000262785 00000 n +0000262870 00000 n +0000262954 00000 n +0000263044 00000 n +0000263129 00000 n +0000263213 00000 n +0000263303 00000 n +0000263388 00000 n +0000263472 00000 n +0000263562 00000 n +0000263647 00000 n +0000263731 00000 n +0000263821 00000 n +0000263906 00000 n +0000263990 00000 n +0000264068 00000 n +0000264153 00000 n +0000264237 00000 n +0000264327 00000 n +0000264412 00000 n +0000264496 00000 n +0000264586 00000 n +0000264671 00000 n +0000264749 00000 n +0000264834 00000 n +0000264918 00000 n +0000264996 00000 n +0000265081 00000 n +0000265166 00000 n +0000265245 00000 n +0000265331 00000 n +0000265416 00000 n +0000265507 00000 n +0000265593 00000 n +0000265678 00000 n +0000265763 00000 n +0000265848 00000 n +0000265933 00000 n +0000266025 00000 n +0000266111 00000 n +0000266197 00000 n +0000266283 00000 n +0000266369 00000 n +0000266461 00000 n +0000266547 00000 n +0000266633 00000 n +0000266725 00000 n +0000266811 00000 n +0000266903 00000 n +0000266989 00000 n +0000267075 00000 n +0000267167 00000 n +0000267253 00000 n +0000267345 00000 n +0000267431 00000 n +0000267517 00000 n +0000267613 00000 n +0000267705 00000 n +0000267797 00000 n +0000267883 00000 n +0000267969 00000 n +0000268061 00000 n +0000268147 00000 n +0000268239 00000 n +0000268325 00000 n +0000268411 00000 n +0000268507 00000 n +0000268599 00000 n +0000268691 00000 n +0000268777 00000 n +0000268863 00000 n +0000268955 00000 n +0000269041 00000 n +0000269133 00000 n +0000269219 00000 n +0000269305 00000 n +0000269391 00000 n +0000269483 00000 n +0000269569 00000 n +0000269655 00000 n +0000269741 00000 n +0000269833 00000 n +0000269919 00000 n +0000270005 00000 n +0000270091 00000 n +0000270187 00000 n +0000270279 00000 n +0000270365 00000 n +0000270451 00000 n +0000270537 00000 n +0000270622 00000 n +0000270713 00000 n +0000270799 00000 n +0000270884 00000 n +0000270975 00000 n +0000271061 00000 n +0000271146 00000 n +0000271237 00000 n +0000271323 00000 n +0000271408 00000 n +0000271532 00000 n +0000271656 00000 n +0000271780 00000 n +0000271866 00000 n +0000271952 00000 n +0000272038 00000 n +0000272124 00000 n +0000272209 00000 n +0000272294 00000 n +0000272379 00000 n +0000272464 00000 n +0000272548 00000 n +0000272632 00000 n +0000272716 00000 n +0000272800 00000 n +0000272891 00000 n +0000272976 00000 n +0000273061 00000 n +0000273146 00000 n +0000273231 00000 n +0000273322 00000 n +0000273407 00000 n +0000273492 00000 n +0000273577 00000 n +0000273662 00000 n +0000273753 00000 n +0000273838 00000 n +0000273923 00000 n +0000274008 00000 n +0000274099 00000 n +0000274184 00000 n +0000274269 00000 n +0000274354 00000 n +0000274445 00000 n +0000274530 00000 n +0000274615 00000 n +0000274700 00000 n +0000274791 00000 n +0000274876 00000 n +0000274961 00000 n +0000275046 00000 n +0000275130 00000 n +0000275214 00000 n +0000275298 00000 n +0000275382 00000 n +0000275466 00000 n +0000275551 00000 n +0000275642 00000 n +0000275727 00000 n +0000275812 00000 n +0000275903 00000 n +0000275988 00000 n +0000276073 00000 n +0000276158 00000 n +0000276249 00000 n +0000276334 00000 n +0000276419 00000 n +0000276510 00000 n +0000276595 00000 n +0000276680 00000 n +0000276765 00000 n +0000276856 00000 n +0000276941 00000 n +0000277026 00000 n +0000277117 00000 n +0000277202 00000 n +0000277287 00000 n +0000277371 00000 n +0000277456 00000 n +0000277541 00000 n +0000277626 00000 n +0000277711 00000 n +0000277796 00000 n +0000277881 00000 n +0000277966 00000 n +0000278051 00000 n +0000278136 00000 n +0000278221 00000 n +0000278312 00000 n +0000278436 00000 n +0000278560 00000 n +0000278684 00000 n +0000278808 00000 n +0000278900 00000 n +0000278986 00000 n +0000279072 00000 n +0000279158 00000 n +0000279244 00000 n +0000279336 00000 n +0000279422 00000 n +0000279508 00000 n +0000279594 00000 n +0000279680 00000 n +0000279772 00000 n +0000279858 00000 n +0000279944 00000 n +0000280030 00000 n +0000280116 00000 n +0000280208 00000 n +0000280294 00000 n +0000280380 00000 n +0000280466 00000 n +0000280552 00000 n +0000280644 00000 n +0000280730 00000 n +0000280816 00000 n +0000280902 00000 n +0000280988 00000 n +0000281080 00000 n +0000281166 00000 n +0000281252 00000 n +0000281338 00000 n +0000281424 00000 n +0000281516 00000 n +0000281602 00000 n +0000281688 00000 n +0000281774 00000 n +0000281860 00000 n +0000281952 00000 n +0000282038 00000 n +0000282124 00000 n +0000282210 00000 n +0000282296 00000 n +0000282474 00000 n +0000282565 00000 n +0000282650 00000 n +0000282735 00000 n +0000282820 00000 n +0000282905 00000 n +0000282996 00000 n +0000283081 00000 n +0000283166 00000 n +0000283251 00000 n +0000283336 00000 n +0000283427 00000 n +0000283512 00000 n +0000283597 00000 n +0000283682 00000 n +0000283767 00000 n +0000283858 00000 n +0000283943 00000 n +0000284028 00000 n +0000284113 00000 n +0000284198 00000 n +0000284282 00000 n +0000284366 00000 n +0000284450 00000 n +0000284535 00000 n +0000284620 00000 n +0000284705 00000 n +0000284790 00000 n +0000284875 00000 n +0000284960 00000 n +0000285045 00000 n +0000285130 00000 n +0000285215 00000 n +0000285300 00000 n +0000285385 00000 n +0000285470 00000 n +0000285554 00000 n +0000285638 00000 n +0000285722 00000 n +0000285806 00000 n +0000285891 00000 n +0000285976 00000 n +0000286067 00000 n +0000286152 00000 n +0000286237 00000 n +0000286322 00000 n +0000286407 00000 n +0000286492 00000 n +0000286583 00000 n +0000286668 00000 n +0000286753 00000 n +0000286838 00000 n +0000286923 00000 n +0000287008 00000 n +0000287093 00000 n +0000287178 00000 n +0000287263 00000 n +0000287348 00000 n +0000287433 00000 n +0000287518 00000 n +0000287603 00000 n +0000287688 00000 n +0000287773 00000 n +0000287857 00000 n +0000287941 00000 n +0000288025 00000 n +0000288109 00000 n +0000288194 00000 n +0000288279 00000 n +0000288364 00000 n +0000288449 00000 n +0000288534 00000 n +0000288619 00000 n +0000288704 00000 n +0000288789 00000 n +0000288874 00000 n +0000288959 00000 n +0000289044 00000 n +0000289129 00000 n +0000289214 00000 n +0000289299 00000 n +0000289384 00000 n +0000289469 00000 n +0000289554 00000 n +0000289639 00000 n +0000289724 00000 n +0000289809 00000 n +0000289894 00000 n +0000289979 00000 n +0000290064 00000 n +0000290149 00000 n +0000290234 00000 n +0000290319 00000 n +0000290404 00000 n +0000290489 00000 n +0000290574 00000 n +0000290659 00000 n +0000290744 00000 n +0000290829 00000 n +0000290914 00000 n +0000290999 00000 n +0000291084 00000 n +0000291169 00000 n +0000291254 00000 n +0000291339 00000 n +0000291424 00000 n +0000291509 00000 n +0000291594 00000 n +0000291679 00000 n +0000291764 00000 n +0000291849 00000 n +0000291934 00000 n +0000292019 00000 n +0000292104 00000 n +0000292189 00000 n +0000292274 00000 n +0000292359 00000 n +0000292444 00000 n +0000292529 00000 n +0000292614 00000 n +0000292699 00000 n +0000292784 00000 n +0000292869 00000 n +0000292954 00000 n +0000293039 00000 n +0000293124 00000 n +0000293209 00000 n +0000293294 00000 n +0000293379 00000 n +0000293464 00000 n +0000293549 00000 n +0000293634 00000 n +0000293719 00000 n +0000293804 00000 n +0000293889 00000 n +0000293974 00000 n +0000294059 00000 n +0000294144 00000 n +0000294229 00000 n +0000294314 00000 n +0000294399 00000 n +0000294484 00000 n +0000294569 00000 n +0000294654 00000 n +0000294739 00000 n +0000294824 00000 n +0000294909 00000 n +0000294994 00000 n +0000295079 00000 n +0000295164 00000 n +0000295249 00000 n +0000295334 00000 n +0000295419 00000 n +0000295504 00000 n +0000295589 00000 n +0000295674 00000 n +0000295759 00000 n +0000295844 00000 n +0000295929 00000 n +0000296014 00000 n +0000296099 00000 n +0000296184 00000 n +0000296269 00000 n +0000296354 00000 n +0000296439 00000 n +0000296524 00000 n +0000296609 00000 n +0000296694 00000 n +0000296779 00000 n +0000296864 00000 n +0000296949 00000 n +0000297034 00000 n +0000297119 00000 n +0000297198 00000 n +0000297289 00000 n +0000297375 00000 n +0000297460 00000 n +0000297539 00000 n +0000297624 00000 n +0000297715 00000 n +0000297801 00000 n +0000297886 00000 n +0000297977 00000 n +0000298063 00000 n +0000298148 00000 n +0000298227 00000 n +0000298312 00000 n +0000298391 00000 n +0000298482 00000 n +0000298568 00000 n +0000298653 00000 n +0000298737 00000 n +0000298821 00000 n +0000298905 00000 n +0000298989 00000 n +0000299073 00000 n +0000299157 00000 n +0000299241 00000 n +0000299325 00000 n +0000299409 00000 n +0000299493 00000 n +0000299577 00000 n +0000299661 00000 n +0000299745 00000 n +0000299829 00000 n +0000299913 00000 n +0000299997 00000 n +0000300081 00000 n +0000300165 00000 n +0000300249 00000 n +0000300333 00000 n +0000300417 00000 n +0000300501 00000 n +0000300585 00000 n +0000300669 00000 n +0000300753 00000 n +0000300837 00000 n +0000300921 00000 n +0000301005 00000 n +0000301089 00000 n +0000301173 00000 n +0000301257 00000 n +0000301341 00000 n +0000301425 00000 n +0000301509 00000 n +0000301593 00000 n +0000301677 00000 n +0000301761 00000 n +0000301845 00000 n +0000301929 00000 n +0000302013 00000 n +0000302097 00000 n +0000302181 00000 n +0000302265 00000 n +0000302349 00000 n +0000302433 00000 n +0000302517 00000 n +0000302601 00000 n +0000302685 00000 n +0000302769 00000 n +0000302853 00000 n +0000302937 00000 n +0000303021 00000 n +0000303105 00000 n +0000303189 00000 n +0000303273 00000 n +0000303357 00000 n +0000303441 00000 n +0000303525 00000 n +0000303609 00000 n +0000303693 00000 n +0000303777 00000 n +0000303861 00000 n +0000303946 00000 n +0000304031 00000 n +0000304116 00000 n +0000304201 00000 n +0000304284 00000 n +0000304367 00000 n +0000304450 00000 n +0000304534 00000 n +0000304618 00000 n +0000304702 00000 n +0000304786 00000 n +0000304870 00000 n +0000304954 00000 n +0000305038 00000 n +0000305122 00000 n +0000305206 00000 n +0000305290 00000 n +0000305374 00000 n +0000305458 00000 n +0000305542 00000 n +0000305626 00000 n +0000305710 00000 n +0000305794 00000 n +0000305878 00000 n +0000305962 00000 n +0000306046 00000 n +0000306130 00000 n +0000306214 00000 n +0000306298 00000 n +0000306382 00000 n +0000306466 00000 n +0000306550 00000 n +0000306634 00000 n +0000306718 00000 n +0000306802 00000 n +0000306886 00000 n +0000306970 00000 n +0000307054 00000 n +0000307138 00000 n +0000307223 00000 n +0000307307 00000 n +0000307391 00000 n +0000307475 00000 n +0000307559 00000 n +0000307643 00000 n +0000307727 00000 n +0000307811 00000 n +0000307895 00000 n +0000307979 00000 n +0000308063 00000 n +0000308147 00000 n +0000308231 00000 n +0000308315 00000 n +0000308399 00000 n +0000308483 00000 n +0000308567 00000 n +0000308651 00000 n +0000308736 00000 n +0000308821 00000 n +0000308906 00000 n +0000308991 00000 n +0000309076 00000 n +0000309161 00000 n +0000309246 00000 n +0000309331 00000 n +0000309416 00000 n +0000309501 00000 n +0000309586 00000 n +0000309671 00000 n +0000309755 00000 n +0000309839 00000 n +0000309923 00000 n +0000310008 00000 n +0000310093 00000 n +0000310178 00000 n +0000310263 00000 n +0000310348 00000 n +0000310433 00000 n +0000310518 00000 n +0000310603 00000 n +0000310688 00000 n +0000310773 00000 n +0000310858 00000 n +0000310943 00000 n +0000311028 00000 n +0000311113 00000 n +0000311198 00000 n +0000311282 00000 n +0000311366 00000 n +0000311450 00000 n +0000311534 00000 n +0000311618 00000 n +0000311702 00000 n +0000311786 00000 n +0000311870 00000 n +0000311954 00000 n +0000312038 00000 n +0000312122 00000 n +0000312206 00000 n +0000312290 00000 n +0000312374 00000 n +0000312458 00000 n +0000312542 00000 n +0000312626 00000 n +0000312710 00000 n +0000312794 00000 n +0000312878 00000 n +0000312962 00000 n +0000313046 00000 n +0000313130 00000 n +0000313214 00000 n +0000313298 00000 n +0000313382 00000 n +0000313466 00000 n +0000313550 00000 n +0000313634 00000 n +0000313718 00000 n +0000313802 00000 n +0000313886 00000 n +0000313970 00000 n +0000314054 00000 n +0000314138 00000 n +0000314222 00000 n +0000314306 00000 n +0000314390 00000 n +0000314474 00000 n +0000314558 00000 n +0000314642 00000 n +0000314726 00000 n +0000314810 00000 n +0000314894 00000 n +0000314978 00000 n +0000315062 00000 n +0000315146 00000 n +0000315230 00000 n +0000315315 00000 n +0000315400 00000 n +0000315485 00000 n +0000315570 00000 n +0000315655 00000 n +0000315740 00000 n +0000315825 00000 n +0000315910 00000 n +0000315995 00000 n +0000316080 00000 n +0000316165 00000 n +0000316250 00000 n +0000316335 00000 n +0000316420 00000 n +0000316505 00000 n +0000316590 00000 n +0000316675 00000 n +0000316760 00000 n +0000316845 00000 n +0000316930 00000 n +0000317015 00000 n +0000317100 00000 n +0000317185 00000 n +0000317270 00000 n +0000317355 00000 n +0000317440 00000 n +0000317525 00000 n +0000317610 00000 n +0000317695 00000 n +0000317779 00000 n +0000317863 00000 n +0000317947 00000 n +0000318031 00000 n +0000318115 00000 n +0000318199 00000 n +0000318283 00000 n +0000318367 00000 n +0000318451 00000 n +0000318535 00000 n +0000318619 00000 n +0000318710 00000 n +0000318795 00000 n +0000318880 00000 n +0000318965 00000 n +0000319050 00000 n +0000319135 00000 n +0000319226 00000 n +0000319311 00000 n +0000319396 00000 n +0000319481 00000 n +0000319566 00000 n +0000319651 00000 n +0000319736 00000 n +0000319821 00000 n +0000319906 00000 n +0000319997 00000 n +0000320082 00000 n +0000320167 00000 n +0000320252 00000 n +0000320337 00000 n +0000320422 00000 n +0000320506 00000 n +0000320590 00000 n +0000320674 00000 n +0000320758 00000 n +0000320842 00000 n +0000320926 00000 n +0000321010 00000 n +0000321094 00000 n +0000321178 00000 n +0000321262 00000 n +0000321346 00000 n +0000321430 00000 n +0000321514 00000 n +0000321598 00000 n +0000321682 00000 n +0000321766 00000 n +0000321850 00000 n +0000321934 00000 n +0000322018 00000 n +0000322102 00000 n +0000322186 00000 n +0000322270 00000 n +0000322354 00000 n +0000322438 00000 n +0000322522 00000 n +0000322606 00000 n +0000322690 00000 n +0000322774 00000 n +0000322858 00000 n +0000322942 00000 n +0000323026 00000 n +0000323110 00000 n +0000323194 00000 n +0000323278 00000 n +0000323362 00000 n +0000323446 00000 n +0000323530 00000 n +0000323614 00000 n +0000323698 00000 n +0000323782 00000 n +0000323867 00000 n +0000323952 00000 n +0000324037 00000 n +0000324122 00000 n +0000324207 00000 n +0000324292 00000 n +0000324377 00000 n +0000324462 00000 n +0000324547 00000 n +0000324632 00000 n +0000324717 00000 n +0000324802 00000 n +0000324887 00000 n +0000324972 00000 n +0000325057 00000 n +0000325142 00000 n +0000325227 00000 n +0000325312 00000 n +0000325397 00000 n +0000325482 00000 n +0000325567 00000 n +0000325652 00000 n +0000325737 00000 n +0000325822 00000 n +0000325907 00000 n +0000325992 00000 n +0000326077 00000 n +0000326162 00000 n +0000326247 00000 n +0000326332 00000 n +0000326417 00000 n +0000326502 00000 n +0000326587 00000 n +0000326672 00000 n +0000326757 00000 n +0000326842 00000 n +0000326927 00000 n +0000327012 00000 n +0000327097 00000 n +0000327182 00000 n +0000327266 00000 n +0000327350 00000 n +0000327434 00000 n +0000327518 00000 n +0000327602 00000 n +0000327686 00000 n +0000327770 00000 n +0000327854 00000 n +0000327938 00000 n +0000328022 00000 n +0000328106 00000 n +0000328190 00000 n +0000328274 00000 n +0000328358 00000 n +0000328442 00000 n +0000328526 00000 n +0000328610 00000 n +0000328694 00000 n +0000328778 00000 n +0000328862 00000 n +0000328946 00000 n +0000329030 00000 n +0000329114 00000 n +0000329198 00000 n +0000329282 00000 n +0000329366 00000 n +0000329450 00000 n +0000329534 00000 n +0000329618 00000 n +0000329702 00000 n +0000329786 00000 n +0000329870 00000 n +0000329954 00000 n +0000330038 00000 n +0000330122 00000 n +0000330206 00000 n +0000330290 00000 n +0000330374 00000 n +0000330458 00000 n +0000330542 00000 n +0000330626 00000 n +0000330710 00000 n +0000330794 00000 n +0000330878 00000 n +0000330962 00000 n +0000331046 00000 n +0000331130 00000 n +0000331214 00000 n +0000331298 00000 n +0000331382 00000 n +0000331466 00000 n +0000331550 00000 n +0000331634 00000 n +0000331718 00000 n +0000331802 00000 n +0000331886 00000 n +0000331970 00000 n +0000332054 00000 n +0000332138 00000 n +0000332222 00000 n +0000332306 00000 n +0000332390 00000 n +0000332474 00000 n +0000332558 00000 n +0000332642 00000 n +0000332726 00000 n +0000332810 00000 n +0000332894 00000 n +0000332978 00000 n +0000333062 00000 n +0000333146 00000 n +0000333230 00000 n +0000333314 00000 n +0000333398 00000 n +0000333482 00000 n +0000333567 00000 n +0000333652 00000 n +0000333737 00000 n +0000333822 00000 n +0000333907 00000 n +0000333993 00000 n +0000334079 00000 n +0000334165 00000 n +0000334251 00000 n +0000334337 00000 n +0000334423 00000 n +0000334509 00000 n +0000334595 00000 n +0000334681 00000 n +0000334767 00000 n +0000334853 00000 n +0000334939 00000 n +0000335025 00000 n +0000335111 00000 n +0000335197 00000 n +0000335283 00000 n +0000335369 00000 n +0000335455 00000 n +0000335541 00000 n +0000335627 00000 n +0000335713 00000 n +0000335799 00000 n +0000335885 00000 n +0000335971 00000 n +0000336057 00000 n +0000336143 00000 n +0000336229 00000 n +0000336314 00000 n +0000336399 00000 n +0000336484 00000 n +0000336569 00000 n +0000336653 00000 n +0000336737 00000 n +0000336821 00000 n +0000336905 00000 n +0000336989 00000 n +0000337067 00000 n +0000337157 00000 n +0000337242 00000 n +0000337326 00000 n +0000337416 00000 n +0000337501 00000 n +0000337585 00000 n +0000337663 00000 n +0000337753 00000 n +0000337838 00000 n +0000337922 00000 n +0000338012 00000 n +0000338097 00000 n +0000338181 00000 n +0000338259 00000 n +0000338349 00000 n +0000338434 00000 n +0000338518 00000 n +0000338596 00000 n +0000338680 00000 n +0000338770 00000 n +0000338855 00000 n +0000338939 00000 n +0000339029 00000 n +0000339114 00000 n +0000339198 00000 n +0000339288 00000 n +0000339373 00000 n +0000339457 00000 n +0000339541 00000 n +0000339625 00000 n +0000339709 00000 n +0000339794 00000 n +0000339879 00000 n +0000339964 00000 n +0000340049 00000 n +0000340134 00000 n +0000340219 00000 n +0000340304 00000 n +0000340389 00000 n +0000340474 00000 n +0000340559 00000 n +0000340644 00000 n +0000340729 00000 n +0000340813 00000 n +0000340897 00000 n +0000340981 00000 n +0000341065 00000 n +0000341150 00000 n +0000341235 00000 n +0000341320 00000 n +0000341405 00000 n +0000341490 00000 n +0000341576 00000 n +0000341662 00000 n +0000341748 00000 n +0000341834 00000 n +0000341920 00000 n +0000342006 00000 n +0000342092 00000 n +0000342178 00000 n +0000342264 00000 n +0000342350 00000 n +0000342436 00000 n +0000342521 00000 n +0000342606 00000 n +0000342691 00000 n +0000342777 00000 n +0000342863 00000 n +0000342949 00000 n +0000343035 00000 n +0000343121 00000 n +0000343207 00000 n +0000343293 00000 n +0000343379 00000 n +0000343465 00000 n +0000343551 00000 n +0000343637 00000 n +0000343723 00000 n +0000343809 00000 n +0000343895 00000 n +0000343981 00000 n +0000344067 00000 n +0000344153 00000 n +0000344239 00000 n +0000344325 00000 n +0000344411 00000 n +0000344497 00000 n +0000344621 00000 n +0000344745 00000 n +0000344869 00000 n +0000344955 00000 n +0000345041 00000 n +0000345127 00000 n +0000345213 00000 n +0000345299 00000 n +0000345385 00000 n +0000345470 00000 n +0000345555 00000 n +0000345640 00000 n +0000345725 00000 n +0000345810 00000 n +0000345895 00000 n +0000345980 00000 n +0000346065 00000 n +0000346150 00000 n +0000346235 00000 n +0000346320 00000 n +0000346405 00000 n +0000346489 00000 n +0000346573 00000 n +0000346658 00000 n +0000346743 00000 n +0000346828 00000 n +0000346913 00000 n +0000346998 00000 n +0000347083 00000 n +0000347168 00000 n +0000347253 00000 n +0000347337 00000 n +0000347421 00000 n +0000347504 00000 n +0000347587 00000 n +0000347670 00000 n +0000347753 00000 n +0000347836 00000 n +0000347919 00000 n +0000348002 00000 n +0000348086 00000 n +0000348170 00000 n +0000348254 00000 n +0000348338 00000 n +0000348422 00000 n +0000348506 00000 n +0000348590 00000 n +0000348674 00000 n +0000348758 00000 n +0000348842 00000 n +0000348926 00000 n +0000349010 00000 n +0000349094 00000 n +0000349178 00000 n +0000349262 00000 n +0000349346 00000 n +0000349430 00000 n +0000349514 00000 n +0000349598 00000 n +0000349682 00000 n +0000349766 00000 n +0000349850 00000 n +0000349934 00000 n +0000350018 00000 n +0000350102 00000 n +0000350186 00000 n +0000350270 00000 n +0000350354 00000 n +0000350438 00000 n +0000350522 00000 n +0000350606 00000 n +0000350690 00000 n +0000350774 00000 n +0000350858 00000 n +0000350942 00000 n +0000351026 00000 n +0000351110 00000 n +0000351194 00000 n +0000351278 00000 n +0000351362 00000 n +0000351446 00000 n +0000351530 00000 n +0000351614 00000 n +0000351698 00000 n +0000351782 00000 n +0000351866 00000 n +0000351950 00000 n +0000352034 00000 n +0000352118 00000 n +0000352202 00000 n +0000352286 00000 n +0000352370 00000 n +0000352454 00000 n +0000352538 00000 n +0000352622 00000 n +0000352706 00000 n +0000352790 00000 n +0000352874 00000 n +0000352958 00000 n +0000353042 00000 n +0000353126 00000 n +0000353210 00000 n +0000353294 00000 n +0000353378 00000 n +0000353462 00000 n +0000353546 00000 n +0000353630 00000 n +0000353714 00000 n +0000353798 00000 n +0000353882 00000 n +0000353966 00000 n +0000354050 00000 n +0000354134 00000 n +0000354218 00000 n +0000354302 00000 n +0000354386 00000 n +0000354470 00000 n +0000354554 00000 n +0000354638 00000 n +0000354722 00000 n +0000354806 00000 n +0000354890 00000 n +0000354974 00000 n +0000355058 00000 n +0000355142 00000 n +0000355226 00000 n +0000355310 00000 n +0000355394 00000 n +0000355478 00000 n +0000355562 00000 n +0000355647 00000 n +0000355732 00000 n +0000355817 00000 n +0000355902 00000 n +0000355987 00000 n +0000356072 00000 n +0000356157 00000 n +0000356242 00000 n +0000356327 00000 n +0000356412 00000 n +0000356497 00000 n +0000356582 00000 n +0000356667 00000 n +0000356752 00000 n +0000356837 00000 n +0000356922 00000 n +0000357007 00000 n +0000357092 00000 n +0000357177 00000 n +0000357262 00000 n +0000357347 00000 n +0000357432 00000 n +0000357517 00000 n +0000357602 00000 n +0000357687 00000 n +0000357772 00000 n +0000357857 00000 n +0000357942 00000 n +0000358027 00000 n +0000358112 00000 n +0000358197 00000 n +0000358282 00000 n +0000358367 00000 n +0000358452 00000 n +0000358537 00000 n +0000358622 00000 n +0000358707 00000 n +0000358792 00000 n +0000358877 00000 n +0000358962 00000 n +0000359047 00000 n +0000359132 00000 n +0000359217 00000 n +0000359302 00000 n +0000359387 00000 n +0000359472 00000 n +0000359557 00000 n +0000359642 00000 n +0000359727 00000 n +0000359812 00000 n +0000359897 00000 n +0000359982 00000 n +0000360067 00000 n +0000360152 00000 n +0000360237 00000 n +0000360322 00000 n +0000360407 00000 n +0000360492 00000 n +0000360577 00000 n +0000360662 00000 n +0000360747 00000 n +0000360832 00000 n +0000360917 00000 n +0000361002 00000 n +0000361087 00000 n +0000361172 00000 n +0000361257 00000 n +0000361342 00000 n +0000361427 00000 n +0000361512 00000 n +0000361597 00000 n +0000361682 00000 n +0000361767 00000 n +0000361852 00000 n +0000361937 00000 n +0000362022 00000 n +0000362107 00000 n +0000362192 00000 n +0000362277 00000 n +0000362362 00000 n +0000362447 00000 n +0000362532 00000 n +0000362617 00000 n +0000362702 00000 n +0000362787 00000 n +0000362872 00000 n +0000362957 00000 n +0000363042 00000 n +0000363127 00000 n +0000363212 00000 n +0000363297 00000 n +0000363382 00000 n +0000363467 00000 n +0000363552 00000 n +0000363637 00000 n +0000363722 00000 n +0000363807 00000 n +0000363892 00000 n +0000363977 00000 n +0000364062 00000 n +0000364147 00000 n +0000364232 00000 n +0000364317 00000 n +0000364402 00000 n +0000364487 00000 n +0000364836 00000 n +0000365187 00000 n +0000366097 00000 n +0000367577 00000 n +0000368589 00000 n +0000370460 00000 n +0000370618 00000 n +0000370706 00000 n +0000370794 00000 n +0000370882 00000 n +0000371090 00000 n +0000372366 00000 n +0000373540 00000 n +0000374701 00000 n +0000375020 00000 n +0000375255 00000 n +0000375744 00000 n +0000375961 00000 n +0000376988 00000 n +0000377290 00000 n +0000377719 00000 n +0000377975 00000 n +0000378063 00000 n +0000378271 00000 n +0000379547 00000 n +0000379849 00000 n +0000380089 00000 n +0000380459 00000 n +0000380534 00000 n +0000380609 00000 n +0000380684 00000 n +0000380759 00000 n +0000380832 00000 n +0000380905 00000 n +0000380978 00000 n +0000381051 00000 n +0000381124 00000 n +0000381197 00000 n +0000381270 00000 n +0000381343 00000 n +0000381515 00000 n +0000381687 00000 n +0000381859 00000 n +0000382032 00000 n +0000382204 00000 n +0000382376 00000 n +0000382548 00000 n +0000382720 00000 n +0000382893 00000 n +0000383065 00000 n +0000383237 00000 n +0000383409 00000 n +0000383581 00000 n +0000383754 00000 n +0000383926 00000 n +0000384098 00000 n +0000384270 00000 n +0000384442 00000 n +0000384615 00000 n +0000384787 00000 n +0000384959 00000 n +0000385131 00000 n +0000385303 00000 n +0000385476 00000 n +0000385648 00000 n +0000385820 00000 n +0000385992 00000 n +0000386164 00000 n +0000386337 00000 n +0000386509 00000 n +0000386681 00000 n +0000386853 00000 n +0000387026 00000 n +0000387198 00000 n +0000387370 00000 n +0000387542 00000 n +0000387715 00000 n +0000387887 00000 n +0000388059 00000 n +0000388231 00000 n +0000388404 00000 n +0000388576 00000 n +0000388748 00000 n +0000388920 00000 n +0000389093 00000 n +0000389265 00000 n +0000389437 00000 n +0000389609 00000 n +0000389782 00000 n +0000389954 00000 n +0000390126 00000 n +0000390298 00000 n +0000390471 00000 n +0000390643 00000 n +0000390815 00000 n +0000390987 00000 n +0000391160 00000 n +0000391332 00000 n +0000391504 00000 n +0000391676 00000 n +0000391849 00000 n +0000392021 00000 n +0000392193 00000 n +0000392365 00000 n +0000392538 00000 n +0000392710 00000 n +0000392882 00000 n +0000393054 00000 n +0000393227 00000 n +0000393399 00000 n +0000393583 00000 n +0000393756 00000 n +0000393940 00000 n +0000394113 00000 n +0000394306 00000 n +0000394479 00000 n +0000394652 00000 n +0000394825 00000 n +0000394998 00000 n +0000395171 00000 n +0000395344 00000 n +0000395517 00000 n +0000395690 00000 n +0000395863 00000 n +0000396036 00000 n +0000396209 00000 n +0000396382 00000 n +0000396555 00000 n +0000396728 00000 n +0000396901 00000 n +0000397094 00000 n +0000397267 00000 n +0000397440 00000 n +0000397613 00000 n +0000397806 00000 n +0000397979 00000 n +0000398152 00000 n +0000398325 00000 n +0000398518 00000 n +0000398691 00000 n +0000398864 00000 n +0000399037 00000 n +0000399113 00000 n +0000399189 00000 n +0000399265 00000 n +0000399341 00000 n +0000399417 00000 n +0000399493 00000 n +0000399666 00000 n +0000399839 00000 n +0000400023 00000 n +0000400196 00000 n +0000400369 00000 n +0000400542 00000 n +0000400715 00000 n +0000400888 00000 n +0000401061 00000 n +0000401234 00000 n +0000401407 00000 n +0000401580 00000 n +0000401753 00000 n +0000401926 00000 n +0000402099 00000 n +0000402272 00000 n +0000402445 00000 n +0000402618 00000 n +0000402791 00000 n +0000402964 00000 n +0000403137 00000 n +0000403310 00000 n +0000403483 00000 n +0000403656 00000 n +0000403829 00000 n +0000404002 00000 n +0000404175 00000 n +0000404348 00000 n +0000404521 00000 n +0000404694 00000 n +0000404867 00000 n +0000405040 00000 n +0000405213 00000 n +0000405289 00000 n +0000405462 00000 n +0000405635 00000 n +0000405819 00000 n +0000405992 00000 n +0000406165 00000 n +0000406349 00000 n +0000406533 00000 n +0000406706 00000 n +0000406879 00000 n +0000407063 00000 n +0000407236 00000 n +0000407409 00000 n +0000407582 00000 n +0000407755 00000 n +0000407928 00000 n +0000408101 00000 n +0000408274 00000 n +0000408447 00000 n +0000408620 00000 n +0000408793 00000 n +0000408966 00000 n +0000409139 00000 n +0000409312 00000 n +0000409485 00000 n +0000409658 00000 n +0000409842 00000 n +0000410015 00000 n +0000410188 00000 n +0000410361 00000 n +0000410545 00000 n +0000410718 00000 n +0000410891 00000 n +0000411064 00000 n +0000411248 00000 n +0000411421 00000 n +0000411594 00000 n +0000411767 00000 n +0000411940 00000 n +0000412113 00000 n +0000412286 00000 n +0000412459 00000 n +0000412632 00000 n +0000412805 00000 n +0000412978 00000 n +0000413151 00000 n +0000413324 00000 n +0000413497 00000 n +0000413670 00000 n +0000413843 00000 n +0000414016 00000 n +0000414189 00000 n +0000414362 00000 n +0000414535 00000 n +0000414708 00000 n +0000414881 00000 n +0000415054 00000 n +0000415227 00000 n +0000415400 00000 n +0000415573 00000 n +0000415746 00000 n +0000415919 00000 n +0000416092 00000 n +0000416265 00000 n +0000416438 00000 n +0000416611 00000 n +0000416784 00000 n +0000416957 00000 n +0000417130 00000 n +0000417303 00000 n +0000417476 00000 n +0000417649 00000 n +0000417822 00000 n +0000417995 00000 n +0000418168 00000 n +0000418341 00000 n +0000418514 00000 n +0000418687 00000 n +0000418860 00000 n +0000419033 00000 n +0000419206 00000 n +0000419379 00000 n +0000419552 00000 n +0000419725 00000 n +0000419898 00000 n +0000420071 00000 n +0000420244 00000 n +0000420417 00000 n +0000420590 00000 n +0000420763 00000 n +0000420936 00000 n +0000421109 00000 n +0000421282 00000 n +0000421455 00000 n +0000421628 00000 n +0000421801 00000 n +0000421974 00000 n +0000422147 00000 n +0000422331 00000 n +0000422515 00000 n +0000422688 00000 n +0000422872 00000 n +0000423056 00000 n +0000423229 00000 n +0000423402 00000 n +0000423575 00000 n +0000423748 00000 n +0000423921 00000 n +0000424094 00000 n +0000424267 00000 n +0000424440 00000 n +0000424624 00000 n +0000424700 00000 n +0000424873 00000 n +0000425046 00000 n +0000425219 00000 n +0000425392 00000 n +0000425565 00000 n +0000425738 00000 n +0000425911 00000 n +0000426084 00000 n +0000426257 00000 n +0000426430 00000 n +0000426603 00000 n +0000426776 00000 n +0000426949 00000 n +0000427122 00000 n +0000427295 00000 n +0000427479 00000 n +0000427652 00000 n +0000427825 00000 n +0000427998 00000 n +0000428171 00000 n +0000428344 00000 n +0000428517 00000 n +0000428690 00000 n +0000428863 00000 n +0000429036 00000 n +0000429209 00000 n +0000429382 00000 n +0000429566 00000 n +0000429739 00000 n +0000429912 00000 n +0000430085 00000 n +0000430258 00000 n +0000430431 00000 n +0000430604 00000 n +0000430777 00000 n +0000430950 00000 n +0000431123 00000 n +0000431296 00000 n +0000431469 00000 n +0000431642 00000 n +0000431815 00000 n +0000431988 00000 n +0000432161 00000 n +0000432334 00000 n +0000432507 00000 n +0000432680 00000 n +0000432853 00000 n +0000433026 00000 n +0000433199 00000 n +0000433372 00000 n +0000433545 00000 n +0000433718 00000 n +0000433891 00000 n +0000434064 00000 n +0000434237 00000 n +0000434410 00000 n +0000434583 00000 n +0000434756 00000 n +0000434929 00000 n +0000435102 00000 n +0000435275 00000 n +0000435448 00000 n +0000435621 00000 n +0000435794 00000 n +0000435967 00000 n +0000436140 00000 n +0000436313 00000 n +0000436486 00000 n +0000436659 00000 n +0000436832 00000 n +0000437005 00000 n +0000437178 00000 n +0000437351 00000 n +0000437524 00000 n +0000437697 00000 n +0000437870 00000 n +0000438043 00000 n +0000438216 00000 n +0000438389 00000 n +0000438562 00000 n +0000438735 00000 n +0000438908 00000 n +0000439081 00000 n +0000439254 00000 n +0000439427 00000 n +0000439600 00000 n +0000439773 00000 n +0000439946 00000 n +0000440119 00000 n +0000440292 00000 n +0000440465 00000 n +0000440638 00000 n +0000440811 00000 n +0000440984 00000 n +0000441157 00000 n +0000441330 00000 n +0000441503 00000 n +0000441676 00000 n +0000441849 00000 n +0000442022 00000 n +0000442195 00000 n +0000442368 00000 n +0000442541 00000 n +0000442714 00000 n +0000442887 00000 n +0000443060 00000 n +0000443233 00000 n +0000443406 00000 n +0000443579 00000 n +0000443752 00000 n +0000443925 00000 n +0000444098 00000 n +0000444271 00000 n +0000444444 00000 n +0000444617 00000 n +0000444790 00000 n +0000444963 00000 n +0000445136 00000 n +0000445309 00000 n +0000445482 00000 n +0000445655 00000 n +0000445828 00000 n +0000446001 00000 n +0000446174 00000 n +0000446347 00000 n +0000446520 00000 n +0000446693 00000 n +0000446866 00000 n +0000447039 00000 n +0000447212 00000 n +0000447385 00000 n +0000447558 00000 n +0000447731 00000 n +0000447807 00000 n +0000447883 00000 n +0000447959 00000 n +0000448035 00000 n +0000448111 00000 n +0000448187 00000 n +0000448263 00000 n +0000448339 00000 n +0000448415 00000 n +0000448491 00000 n +0000448567 00000 n +0000448643 00000 n +0000448719 00000 n +0000448795 00000 n +0000448871 00000 n +0000448947 00000 n +0000449024 00000 n +0000449101 00000 n +0000449178 00000 n +0000449255 00000 n +0000449332 00000 n +0000449409 00000 n +0000449486 00000 n +0000449563 00000 n +0000449640 00000 n +0000449717 00000 n +0000449794 00000 n +0000449871 00000 n +0000449948 00000 n +0000450025 00000 n +0000450102 00000 n +0000450179 00000 n +0000450256 00000 n +0000450333 00000 n +0000450410 00000 n +0000450487 00000 n +0000450564 00000 n +0000450641 00000 n +0000450718 00000 n +0000450795 00000 n +0000450872 00000 n +0000450949 00000 n +0000451026 00000 n +0000451103 00000 n +0000451180 00000 n +0000451257 00000 n +0000451334 00000 n +0000451411 00000 n +0000451488 00000 n +0000451565 00000 n +0000451642 00000 n +0000451719 00000 n +0000451796 00000 n +0000451873 00000 n +0000451950 00000 n +0000452027 00000 n +0000452104 00000 n +0000452181 00000 n +0000452236 00000 n +0000452504 00000 n +0000452559 00000 n +0000452830 00000 n +0000453087 00000 n +0000453338 00000 n +0000453650 00000 n +0000454010 00000 n +0000454370 00000 n +0000454730 00000 n +0000455090 00000 n +0000455450 00000 n +0000455810 00000 n +0000456131 00000 n +0000456491 00000 n +0000456851 00000 n +0000457211 00000 n +0000457571 00000 n +0000457931 00000 n +0000458291 00000 n +0000458614 00000 n +0000458974 00000 n +0000459334 00000 n +0000459694 00000 n +0000460054 00000 n +0000460414 00000 n +0000460774 00000 n +0000461134 00000 n +0000461381 00000 n +0000461613 00000 n +0000461870 00000 n +0000462118 00000 n +0000524566 00000 n +0000596184 00000 n +0000596277 00000 n +0000596599 00000 n +0000596692 00000 n +0000597051 00000 n +0000597144 00000 n +0000597645 00000 n +0000597738 00000 n +0000598111 00000 n +0000598204 00000 n +0000598691 00000 n +0000598784 00000 n +0000599154 00000 n +0000599247 00000 n +0000599610 00000 n +0000599703 00000 n +0000600065 00000 n +0000600158 00000 n +0000600663 00000 n +0000600756 00000 n +0000601261 00000 n +0000601354 00000 n +0000602080 00000 n +0000602173 00000 n +0000602899 00000 n +0000602992 00000 n +0000603320 00000 n +0000603413 00000 n +0000604143 00000 n +0000604236 00000 n +0000604968 00000 n +0000605061 00000 n +0000605430 00000 n +0000605523 00000 n +0000605898 00000 n +0000605991 00000 n +0000606358 00000 n +0000606451 00000 n +0000606818 00000 n +0000625130 00000 n +0000645650 00000 n +0000654929 00000 n +0000661607 00000 n +0000661939 00000 n +0000662271 00000 n +0000662603 00000 n +0000662935 00000 n +0000663267 00000 n +0000663599 00000 n +0000663931 00000 n +0000664263 00000 n +0000664595 00000 n +0000664927 00000 n +0000665259 00000 n +0000665591 00000 n +0000665923 00000 n +0000666255 00000 n +0000666587 00000 n +0000666919 00000 n +0000667251 00000 n +0000667583 00000 n +0000667915 00000 n +0000668207 00000 n +0000668536 00000 n +0000668981 00000 n +0000669326 00000 n +0000669771 00000 n +0000670111 00000 n +0000670450 00000 n +0000670788 00000 n +0000671245 00000 n +0000671702 00000 n +0000672347 00000 n +0000672992 00000 n +0000673290 00000 n +0000673960 00000 n +0000674632 00000 n +0000674977 00000 n +0000675328 00000 n +0000675665 00000 n +trailer +<< +/Info 1 0 R +/Root 2 0 R +/Size 3053 +>> +startxref +676002 +%%EOF diff --git a/data/CODE_REVIEW_STATUS.md b/data/CODE_REVIEW_STATUS.md new file mode 100644 index 0000000..a3c235c --- /dev/null +++ b/data/CODE_REVIEW_STATUS.md @@ -0,0 +1,473 @@ +# VesiScan-Basic 코드 리뷰 현황 보고서 + +작성일: 2026-03-16 +대상: VesiScan BASIC 펌웨어 전체 (nRF52840 + S140 SoftDevice) +기준 문서: CODE_REVIEW.pdf (2026-03-15) +현재 빌드: DEBUG_MINIMAL_BOOT=1, BLE_DEV_MODE=1 + +## 목차 + +1. 삭제 대상: 미사용 하드웨어 드라이버 +2. 삭제 대상: 미사용 코드 +3. DEBUG_MINIMAL_BOOT 조건부 컴파일 정리 +4. Keil 프로젝트 파일 정리 +5. 버그 및 오류 수정 +6. 저전력 최적화 +7. 코드 품질 개선 +8. 작업 우선순위 요약 + +--- + +## 1. 삭제 대상: 미사용 하드웨어 드라이버 + +### 1.1 회로 기반 분석 + +변경 없음. VB0HW0100 회로 기준 IC 목록은 CODE_REVIEW.pdf 1.1절과 동일. + +### 1.2 회로에 없는 IC의 드라이버 (삭제 대상) + +| 파일 | IC/기능 | 판정 | 현재 상태 | +|------|--------|------|----------| +| ad5272_i2c.c/h | AD5272 디지털 포텐시오미터 | 삭제 | **완료** | +| ada2200_spi.c/h | ADA2200 동기 복조기 | 삭제 | **완료** | +| mcp4725_i2c.c/h | MCP4725 DAC | 삭제 | **완료** | +| mcp4725_adc.c/h | MCP4725 ADC 피드백 | 삭제 | **완료** | +| ir_i2c.c/h | IR LED 센서 (0x50~0x57) | 삭제 | **완료** | +| LED_Parse.c/h | LED ROM 파싱 | 삭제 | **완료** | + +### 1.3 기능적으로 미사용인 드라이버 (삭제 대상) + +| 파일 | 기능 | 판정 | 현재 상태 | +|------|------|------|----------| +| measurements.c/h | 레거시 측정 루프 | 삭제 | **완료** | +| measurements_20.c/h | 20-샘플 측정 변형 | 삭제 | **완료** | +| meas_pd_imm.c/h | 즉시 PD 측정 | 삭제 | **완료** | +| meas_pd_buff.c/h | 버퍼드 PD 측정 | 삭제 | **완료** | +| meas_pd_voltage_simple.c/h | 단순 전압 측정 | 삭제 | **완료** | +| meas_pd_voltage_half.c/h | 반파 전압 측정 | 삭제 | **완료** | +| meas_pd_voltage_full.c/h | 전파 전압 측정 | 삭제 | **완료** | +| meas_pd_voltage_custom.c/h | 커스텀 전압 측정 | 삭제 | **완료** | +| full_agc.c/h | 자동 이득 제어 | 삭제 | **완료** | +| debuf_print.h | 오타 파일 | 삭제 | **완료** | + +### 1.4 삭제 시 의존성 영향 + +cmd_parse.h에서 제거할 include 목록: + +| include | 현재 상태 | +|---------|----------| +| #include "ir_i2c.h" | **완료** (제거됨) | +| #include "ad5272_i2c.h" | **완료** (제거됨) | +| #include "ada2200_spi.h" | **완료** (제거됨) | +| #include "mcp4725_i2c.h" | **완료** (제거됨) | +| #include "measurements.h" | **완료** (제거됨) | +| #include "meas_pd_voltage_simple.h" | **완료** (제거됨) | +| #include "meas_pd_voltage_half.h" | **완료** (제거됨) | +| #include "meas_pd_voltage_full.h" | **완료** (제거됨) | +| #include "full_agc.h" | **완료** (제거됨) | +| #include "meas_pd_imm.h" | **완료** (제거됨) | + +### 1.5 cat_interface.c (EEPROM 드라이버) 삭제 분석 + +#### 1.5.1 결론: EEPROM 삭제 완료, TWI는 i2c_manager.c로 통합 + +현재 상태: **완료** - jhChun 26.03.16 + +cat_interface.c 삭제(EEPROM/AES 코드 전체 삭제). TWI 인스턴스(m_twi) 및 초기화/해제 함수는 i2c_manager.c로 통합. + + +#### 1.5.2 cat_interface.c가 제공하는 것 + +| 기능 | 판정 | 현재 상태 | +|------|------|----------| +| m_eeprom TWI 인스턴스 | i2c_manager.c로 이동, m_twi로 리네이밍 | **완료** | +| eeprom_initialize() / uninitialize() | i2c_manager.c로 이동, twi_initialize/uninitialize로 리네이밍 (static) | **완료** | +| eeprom_read/write_byte/word/page/bytes | 삭제 | **완료** | +| eeprom_read/write_uint16_array | 삭제 | **완료** | +| eeprom_read/write_uint32 | 삭제 | **완료** | +| eeprom_write_encrypted() / read_decrypted() | 삭제 | **완료** | +| encrypt_data() / decrypt_data() | 삭제 | **완료** | +| aes_key[16], aes_iv[16] | 삭제 | **완료** | + +#### 1.5.3 권장 작업 + +| # | 작업 | 현재 상태 | +|---|------|----------| +| 1 | TWI 인스턴스/init/uninit → i2c_manager.c로 통합 | **완료** | +| 2 | m_eeprom → m_twi 리네이밍 | **완료** | +| 3 | EEPROM read/write 전체 삭제, AES 전체 삭제 | **완료** | +| 4 | cmd_parse.c EEPROM 호출 -> FDS 전환 | **완료** | +| 5 | main.c 버튼 롱프레스 리셋: EEPROM -> FDS | **완료** | +| 6 | power_control.c: cat_interface.h include 제거 | **완료** | + +#### 1.5.4 cmd_parse.c EEPROM -> FDS 전환 목록 + +| EEPROM 호출 | 위치 | FDS 대체 방법 | 현재 상태 | +|------------|------|------------|----------| +| eeprom_init_values_read() | cmd_parse.c | 삭제 (FDS config_load 대체) | **완료** | +| eeprom_write_byte(0x0070, m_pd_adc_cnt) | cmd_parse.c | m_config.pd_adc_cnt = val; config_save(); | **완료** | +| eeprom_write_word(0x0080, m_pd_delay_us) | cmd_parse.c | m_config.pd_delay_us = val; config_save(); | **완료** | +| eeprom_write_byte(0x0060, bond_data_delete) | cmd_parse.c | m_config.bond_data_delete = val; config_save(); | **완료** | +| eeprom_write_byte(0x0065, m_reset_status) | cmd_parse.c | m_config.reset_status = val; config_save(); | **완료** | +| eeprom_write_encrypted(0x0020, passkey, 6) | cmd_parse.c | memcpy(m_config.static_passkey, val, 6); config_save(); | **완료** | +| eeprom_read_decrypted(0x0020, passkey, 6) | cmd_parse.c | memcpy(buf, m_config.static_passkey, 6); | **완료** | +| eeprom_write_uint32(0x0090, m_life_cycle) | cmd_parse.c | m_config.life_cycle = val; config_save(); (FDS 필드 추가 완료) | **완료** | +| eeprom_read_uint32(0x0090, &m_life_cycle) | cmd_parse.c | m_life_cycle = m_config.life_cycle; | **완료** | +| eeprom_write/read_uint16_array(0x0480, ...) | cmd_parse.c | AGC gain — HW 제거됨, 명령 비활성화 | **완료** | + +--- + +## 2. 삭제 대상: 미사용 코드 + +### 2.1 AES 암호화 (cat_interface.c) + +판정 변경: 전체 삭제 + +| 항목 | 위치 | 판정 | 현재 상태 | +|------|------|------|----------| +| aes_key[16] 하드코딩 | cat_interface.c | 삭제 | **완료** | +| aes_iv[16] (고정 IV = 0) | cat_interface.c | 삭제 | **완료** | +| encrypt_data() | cat_interface.c | 삭제 | **완료** | +| decrypt_data() | cat_interface.c | 삭제 | **완료** | +| eeprom_write_encrypted() | cat_interface.c | 삭제 | **완료** | +| eeprom_read_decrypted() | cat_interface.c | 삭제 | **완료** | + +### 2.2 Serial Number / Passkey / HW Version 중복 선언 분석 + +| 데이터 | 전역 변수 (런타임) | FDS (내장 Flash) | EEPROM (외부, 제거됨) | 현재 상태 | +|--------|----------------|----------------|-------------------|----------| +| Serial Number | SERIAL_NO[12] | m_config.serial_no[12] | ~~addr 0x0030~~ | **EEPROM 경로 삭제 완료** | +| Passkey | m_static_passkey[6] | m_config.static_passkey[6] | ~~addr 0x0020~~ | **EEPROM 경로 삭제 완료** | +| HW Version | HW_NO[12] | m_config.hw_no[12] | ~~addr 0x0010~~ | **HW_NO 미삭제** | + +권장 작업 현황: + +| # | 작업 | 현재 상태 | +|---|------|----------| +| 1 | EEPROM 경로 삭제 -> eeprom_init_values_read() 삭제 | **완료** | +| 2 | HW_NO[12] 삭제 -> m_config.hw_no 직접 사용 | **미완료** | +| 3 | SERIAL_NO, m_static_passkey 유지 (BLE 스택 필요) | 해당없음 | +| 4 | 데이터 흐름 단순화: FDS -> 전역변수 -> BLE 스택 | **미완료** | + +### 2.3 미사용 전역 변수 + +| 변수 | 위치 | 판정 | 현재 상태 | +|------|------|------|----------| +| roles_str[] | main.c:189 | 삭제 | **미완료** | +| m_encrypted_text[16] | main.c:194 | 삭제 | **미완료** | +| m_encrypted_text2[16] | main.c:195 | 삭제 | **미완료** | +| m_decrypted_text[16] | main.c:196 | 삭제 | **미완료** | +| DEVICE_NAME | cmd_parse.c | 삭제 | 확인 필요 | +| HW_NO[12] | cmd_parse.c | 삭제 | **미완료** | +| AES_KEY_SIZE | main.c:154 | 삭제 | **미완료** | +| AES_BLOCK_SIZE | main.c:155 | 삭제 | **미완료** | +| suppress_unused_warnings() | main.c:239 | 삭제 | **미완료** | +| c_addr[6] | main.c:187 | 삭제 | **미완료** | +| led_pd_dac_v[LED_NUM] | 참조 다수 | 삭제 | 확인 필요 | + +### 2.4 주석 처리된 코드 + +| 위치 | 내용 | 판정 | 현재 상태 | +|------|------|------|----------| +| main_timer.c:37-88 | FEATURE_DETAIL_VALUE_FULL 주석 블록 | 삭제 | **미완료** | +| cmd_parse.c:282-317 | serial_to_passkey_hash, test_eeprom_page_rw | 삭제 | **미완료** | +| cmd_parse.c:87-88 | pd_adc_half/full_a_start extern | 삭제 | 확인 필요 | +| battery_saadc.c:22 | //#include "fstorage.h" | 삭제 | **미완료** | + +--- + +## 3. DEBUG_MINIMAL_BOOT 조건부 컴파일 정리 + +현재 DEBUG_MINIMAL_BOOT=1로 MINIMAL 모드만 사용. Full boot 경로는 실행되지 않음. + +### 3.1 제거 대상 #if 블록 + +| 파일 | 블록 | 판정 | 현재 상태 | +|------|------|------|----------| +| main.c:280-281 | #if !DEBUG_MINIMAL_BOOT full_gpio_init() | 삭제 (함수 전체) | **미완료** | +| main.c:354-355 | #if !DEBUG_MINIMAL_BOOT load_eeprom_config() | 삭제 (함수 전체, EEPROM 제거 완료) | **완료** (함수 삭제됨) | +| main.c:1437-1439 | Full boot 경로 (ada2200_init, mcp4725_init 등) | 삭제 | **미완료** | +| main.c GPIO init 분기 | GPIO init 분기 | MINIMAL 코드만 유지 | **미완료** | +| power_control.c | Full boot power sequence | 삭제 (minimal 경로만 유지) | **미완료** | + +### 3.3 DEBUG_MINIMAL_BOOT 제거 시 함께 정리 + +| 항목 | 현재 상태 | +|------|----------| +| #define DEBUG_MINIMAL_BOOT 1 삭제 (main.c:96) | **미완료** (여전히 활성) | +| 모든 #if 조건 제거, MINIMAL 코드만 유지 | **미완료** | +| BLE_DEV_MODE define 유지 | 해당없음 | + +--- + +## 4. Keil 프로젝트 파일 정리 + +### 4.1 삭제할 소스 참조 (uvprojx) + +현재 상태: **정리 불필요** + +ble_app_bladder_patch_s140.uvprojx 확인 결과, 아래 삭제 대상 파일들은 이미 프로젝트에 등록되어 있지 않음: + +- ad5272_i2c.c, ada2200_spi.c, mcp4725_i2c.c, mcp4725_adc.c +- ir_i2c.c, LED_Parse.c, measurements.c, measurements_20.c +- full_agc.c, meas_pd_voltage_custom.c, cat_interface.c + +uvprojx 수정 작업 없음. + +--- + +## 5. 버그 및 오류 수정 + +### 5.1 심각도 높음 (HIGH) + +#### B1: BLE TX 큐 풀 시 APP_ERROR_CHECK로 인한 시스템 먹통 현상 + +파일: main.c (구 binary_tx_handler) + +현재 상태: **완료** + +- `binary_tx_handler()` 함수 본체 삭제 +- 모든 호출처를 `dr_binary_tx_safe()`로 교체 완료 + - cmd_parse.c (22곳 + 함수 포인터 1곳) + - battery_saadc.c (2곳) + - app_raw.c (2곳) + - tmp235_q1.c (1곳) + - parser.c (17곳) +- main.h 선언 제거, dr_util.c/dr_adc121s051.c의 옛날 extern 선언 제거 +- `dr_binary_tx_safe()`는 NRF_ERROR_RESOURCES 시 최대 100회 재시도 후 패킷 드롭, 연결 에러 시 graceful 리턴 +- `data_tx_handler()`의 APP_ERROR_CHECK도 DBG_PRINTF로 교체 — 예상치 못한 에러 시에도 패킷 드롭 후 정상 동작 유지 + +#### B2: nrf_delay_ms(10) 블로킹 대기 (BLE TX) + +파일: main.c:1221-1228 + +현재 상태: **완료** + +조건문 로직이 정상 수정됨. NRF_ERROR_RESOURCES가 아닌 경우에만 delay 실행. + +#### B3: extern + 초기화 동시 사용 + +파일: cmd_parse.c + +현재 상태: **완료** + +`extern int8_t pd_adc_counts[4] = {8, 16, 24, 32};` 선언이 제거됨. + +#### B4: memset/memcpy 버퍼 크기 불일치 및 매직 넘버 + +파일: main.c config_apply_to_globals() + +현재 상태: **완료** + +- memset 오버런 수정: 하드코딩 `16` → `sizeof(SERIAL_NO)`, `PASSKEY_LENGTH` 사용 +- memcpy 매직 넘버 수정: 하드코딩 `12` → `sizeof(m_config.hw_no)`, `sizeof(m_config.serial_no)`, `sizeof(SERIAL_NO)` 등으로 교체 +- m_static_passkey memset/memcpy: `PASSKEY_LENGTH` define 활용 + +스택/힙 오버플로우로 인한 메모리 손상 가능성이 있는 심각한 버그. + +### 5.2 심각도 중간 (MEDIUM) + +#### B6: battery_event_handler에서 floating-point 연산 + +파일: battery_saadc.c:167 + +현재 상태: **미완료** + +여전히 부동소수점 연산 사용 중: +```c +batt_lvl_in_milli_volt_1 = (batt_lvl_in_milli_volt_0) *1.42; +``` + +수정 필요: +```c +batt_lvl_in_milli_volt_1 = (batt_lvl_in_milli_volt_0 * 142) / 100; +``` + +#### B7: main_timer 단발 모드 문제 + +현재 상태: **해당없음** (의도적 설계로 판단) + +#### B8: processing_start_tick 미사용 + +파일: cmd_parse.c:57 + +현재 상태: **완료** (해결됨) + +변수가 5초 타임아웃 추적에 활용되고 있음: +- cmd_parse.c:483에서 초기값 확인 +- cmd_parse.c:489에서 5초 경과 비교 + +#### B9: config_load() goto 기반 흐름 + +파일: fstorage.c:157-261 + +현재 상태: **미완료** + +`goto cfg_load_start` 패턴이 여전히 존재. 3개의 goto 문과 2개의 레이블로 복잡한 흐름 유지 중. FDS 초기화 실패 시 무한 루프 가능성 여전. + +### 5.3 심각도 낮음 (LOW) + +#### B11: debuf_print.h 파일명 오타 + +현재 상태: **완료** (파일 삭제) + +#### B12: 함수 중복 선언 + +파일: main.h:44-54 + +현재 상태: **미완료** + +static 함수 프로토타입 6개가 헤더에 여전히 선언됨: +- advertising_start (FEATURE_SECURE_CONNECTION 내) +- t_power_off_timeout_handler +- power_control_handler +- main_s +- PM_s +- main_routine_handler + +#### B13: LED_ALLOFF, PD_ALLOFF 매크로 정의 위치 + +현재 상태: 확인 필요 + +--- + +## 6. 저전력 최적화 + +### 6.1 현재 전력 구조 분석 + +변경 없음. CODE_REVIEW.pdf 6.1절과 동일. + +### 6.2 개선 항목 + +#### P1: UART 비활성화 (가장 큰 절약 -- 예상 ~1mA 절감) + +파일: main.c:1427 + +현재 상태: **미완료** + +`uart_init()`이 무조건 호출됨. `#if BLE_DEV_MODE` 조건으로 감싸져 있지 않음. + +수정 필요: +```c +#if BLE_DEV_MODE + uart_init(); +#endif +``` + +#### P2: SEGGER RTT 비활성화 (프로덕션) + +파일: debug_print.h + +현재 상태: **미완료** + +`ENABLE_PRINTF`가 `1`로 하드코딩되어 있음. `BLE_DEV_MODE`와 연동되지 않음. + +수정 필요: +```c +#if BLE_DEV_MODE + #define ENABLE_PRINTF 1 +#else + #define ENABLE_PRINTF 0 +#endif +``` + +#### P3: 배터리 타이머 주기 최적화 + +파일: battery_saadc.c:48 + +현재 상태: **미완료** + +`BATTERY_LOOP_INTERVAL = 5000ms` 고정. 동적 조절 로직 없음. + +#### P4: IMU 타이머 조건부 시작 + +파일: main.c BLE 이벤트 핸들러 + +현재 상태: **미완료** + +BLE_GAP_EVT_CONNECTED/DISCONNECTED 핸들러에 IMU 타이머 start/stop 로직 없음. BLE 미연결 시에도 IMU를 읽을 수 있는 상태. + +#### P5: main_loop() 타이머 폴링 효율화 + +현재 상태: **미완료** + +플래그 기반 폴링 패턴 그대로 유지 중. + +#### P6: NRF_LOG 비활성화 고려 + +현재 상태: **미완료** (확인 필요) + +### 6.3 예상 절감 효과 + +| 최적화 | 예상 절감 | 난이도 | 현재 상태 | +|--------|----------|--------|----------| +| P1: UART 비활성화 | ~1mA | 쉬움 | **미완료** | +| P2: RTT 비활성화 | ~0.1-0.5mA | 쉬움 | **미완료** | +| P4: IMU 타이머 조건부 시작 | ~41uA (미연결 시) | 쉬움 | **미완료** | +| P3: 배터리 타이머 동적 | ~5uA | 보통 | **미완료** | +| P5-A: 단발->직접호출 | 응답 개선 | 쉬움 | **미완료** | +| P5-B: app_scheduler | 코드 품질 + 확장성 | 보통 | **미완료** | +| P5-C: IMU FIFO+인터럽트 | 연속측정 시 ~50uA | 어려움 | **미완료** | +| P6: NRF_LOG 비활성화 | ~10uA | 쉬움 | **미완료** | + +--- + +## 7. 코드 품질 개선 + +### 7.1 구조 개선 + +| # | 항목 | 현재 상태 | +|---|------|----------| +| Q1 | main.h에서 static 함수 선언 제거 | **미완료** (6개 잔존) | +| Q2 | cat_interface.c -> i2c_manager.c로 TWI 통합 | **완료** | +| Q3 | extern 변수 과다 사용 | **미완료** (30개 이상) | +| Q4 | main_timer.c main_loop() 플래그 기반 폴링 | **미완료** | +| Q5 | 매직 넘버 제거 | **미완료** | + +### 7.2 코딩 스타일 + +변경 없음. CODE_REVIEW.pdf 7.2절과 동일. + +--- + +## 8. 작업 우선순위 요약 + +### 즉시 수정 (안전/안정성) + +| # | 항목 | 심각도 | 현재 상태 | +|---|------|--------|----------| +| 1 | B4: memset/memcpy 버퍼 크기 불일치 및 매직 넘버 | CRITICAL | **완료** | +| 2 | B1: BLE TX 큐 풀 시 시스템 먹통 (binary_tx_handler → dr_binary_tx_safe 교체) | HIGH | **완료** | +| 3 | B2: BLE TX 에러 핸들링 로직 반전 | HIGH | **완료** | +| 4 | B3: extern + 초기화 동시 사용 | HIGH | **완료** | + +### 1차 정리 (미사용 코드/EEPROM 삭제) + +| # | 항목 | 현재 상태 | +|---|------|----------| +| 5 | 미사용 HW 드라이버 삭제 (1.2절) | **완료** | +| 6 | cat_interface.c EEPROM 기능 삭제 + TWI를 i2c_manager.c로 통합 (1.5절) | **완료** | +| 7 | cmd_parse.c EEPROM 호출 -> FDS 전환 (1.5.4절) | **완료** | +| 8 | 미사용 전역변수 + HW_NO 삭제 (2.2-2.3절) | **미완료** | +| 9 | DEBUG_MINIMAL_BOOT 조건 제거 (3절) | **미완료** | +| 10 | Keil uvprojx 소스 참조 제거 (4절) | 확인 필요 | +| 11 | 주석 처리된 코드 삭제 (2.4절) | **미완료** | + +### 2차 정리 (저전력 최적화) + +| # | 항목 | 예상 절감 | 현재 상태 | +|---|------|----------|----------| +| 12 | P1: UART 비활성화 | ~1mA | **미완료** | +| 13 | P2: RTT 비활성화 | ~0.1-0.5mA | **미완료** | +| 14 | P4: IMU 타이머 BLE 연결 시에만 동작 | ~41uA | **미완료** | +| 15 | P5-A: main_loop 단발 이벤트 직접 호출로 전환 | 응답 개선 | **미완료** | +| 16 | P5-B: app_scheduler 도입 (선택) | 코드 품질 | **미완료** | +| 17 | P3: 배터리 타이머 동적 조절 | ~5uA | **미완료** | + +### 3차 정리 (코드 품질) + +| # | 항목 | 현재 상태 | +|---|------|----------| +| 18 | Q1: main.h static 함수 제거 | **미완료** | +| 19 | Q5: 매직 넘버 define화 | **미완료** | +| 20 | B9: config_load() goto 제거 | **미완료** | diff --git a/data/CODE_REVIEW_STATUS.pdf b/data/CODE_REVIEW_STATUS.pdf new file mode 100644 index 0000000..a9654c9 Binary files /dev/null and b/data/CODE_REVIEW_STATUS.pdf differ diff --git a/data/curcuit/20305 VB0HW0100 (1).asc b/data/curcuit/20305 VB0HW0100 (1).asc new file mode 100644 index 0000000..fe27d56 --- /dev/null +++ b/data/curcuit/20305 VB0HW0100 (1).asc @@ -0,0 +1,3521 @@ +!PADS-POWERPCB-V9.0-METRIC-CP949! NETLIST FILE FROM PADS LOGIC VVX.2 +*REMARK* 20305 VB0HW0100.sch -- Mon Mar 09 17:28:45 2026 +*REMARK* + + +*PCB* GENERAL PARAMETERS OF THE PCB DESIGN + +MAXIMUMLAYER 4 Maximum routing layer + +*PART* ITEMS +R31 RES1005@1005 +C17 CAP1005@1005 +U2 OPA2836IDGSR@SOP50P490X110-10N +C18 CAP1005@1005 +J2 2026560021@2026560021 +R23 RES1005@1005 +R8 RES1005@1005 +U9 RECE.20279.001E.01@RECE.20279.001E.01 +R11 RES1005@1005 +C2 CAP1005@1005 +C30 CAP1608@1608 +C4 CAP1005@1005 +R25 RES1005@1005 +J4 217B-CA04@ATTEND_217B-CA04 +J1 ECV3-06-ICESPI@ECV3-06-ICESPI +C19 CAP1005@1005 +C16 CAP1005@1005 +C23 CAP1005@1005 +R28 RES1005@1005 +R42 RES1005@1005 +R6 RES1005@1005 +R12 RES1005@1005 +U5 MIC5528-3.3YMT@MIC5528-3.3YMT +C21 CAP1005@1005 +C22 CAP1005@1005 +C31 CAP1005@1005 +R14 RES1005@1005 +LED3 LED1608@LED1608 +C32 CAP1608@1608 +C20 CAP1005@1005 +R16 RES1005@1005 +R18 RES1005@1005 +U20 PESD5V0F1BLD_315@PESD5V0F1BLD315 +C15 CAP1005@1005 +C24 CAP1005@1005 +C5 CAP1608@1608 +C7 CAP1608@1608 +C10 CAP1608@1608 +C14 CAP1005@1005 +C12 CAP1005@1005 +C13 CAP1608@1608 +C37 CAP1608@1608 +C38 CAP1608@1608 +U23 ADL5513ACPZ-R7@QFN50P300X300X80-17N-D +C61 CAP1005@1005 +R19 RES1005@1005 +R29 RES1005@1005 +C64 CAP1005@1005 +C67 CAP1005@1005 +R20 RES1005@1005 +C72 CAP1005@1005 +C29 CAP1608@1608 +L4 IND1608@1608 +L3 IND1005@1005 +Y1 FC-12M@FC-12M +R26 RES1005@1005 +R27 RES1005@1005 +Y2 FA-128_32MHZ@FA-128 +R35 RES1005@1005 +C51 CAP1005@1005 +L1 IND1608@1608 +C42 CAP1608@1608 +C36 CAP1005@1005 +R24 RES1005@1005 +H2 M2_HOLE@HOLE-1.8 +C43 CAP1608@1608 +C39 CAP1608@1608 +T5 TEST_POINT@TP +H3 M2_HOLE@HOLE-1.8 +C28 CAP1005@1005 +C27 CAP1005@1005 +R36 RES1005@1005 +C26 CAP1005@1005 +C25 CAP1005@1005 +R39 RES1005@1005 +C40 CAP1005@1005 +C41 CAP1005@1005 +C44 CAP1608@1608 +C45 CAP1608@1608 +C46 CAP1608@1608 +C47 CAP1608@1608 +C48 CAP1005@1005 +C49 CAP1005@1005 +U16 W25Q32RVXHJQ_TR@SON50P300X200X40-9N +C50 CAP1608@1608 +C103 CAP1005@1005 +R83 RES1005@1005 +C52 CAP1608@1608 +R30 RES1005@1005 +C34 CAP1005@1005 +R40 RES1005@1005 +L5 IND1005@1005 +U6 PRG18BC1R0MM1RB@THRMC1608X95N +U7 PRG18BC1R0MM1RB@THRMC1608X95N +L6 IND1608@1608 +SW2 A03-05@A03-05 +C53 CAP1005@1005 +R17 RES1005@1005 +R41 RES1005@1005 +C54 CAP1005@1005 +C55 CAP1005@1005 +C56 CAP1608@1608 +R43 RES1005@1005 +LED4 LED1608@LED1608 +U4 PMFPB8032XP@PMFPB8032XP +P1 AXT510124@PANASONIC_AXT510124 +R15 RES1005@1005 +H4 M2_HOLE@HOLE-1.8 +U10 ICM-42670-P@ICM-42675-P +U27 MD1822K6-G@QFN50P300X300X100-17N-D +C35 CAP1005@1005 +C8 CAP1608@1608 +C9 CAP1005@1005 +H1 M2_HOLE@HOLE-1.8 +JP1 TP_DBL@TP_DBL +R65 RES1005@1005 +D3 DAP222WM@EMD3F-DAP222WM +D4 BAS3005B-02V@SC79-BAS3005B-02V +U1 PRTR5V0U2X@SOT143B-PRTR5V0U2X +R34 RES1005@1005 +U22 TMP235-Q1@SOT-23 +L2 IND1608@1608 +R21 RES1005@1005 +R22 RES1005@1005 +U8 SN74LVC1G04DRY2@USON-SN74LVC1G04DRY2 +R33 RES1005@1005 +R32 RES1005@1005 +R37 RES1005@1005 +R4 RES1005@1005 +U30 TC7920K6-G@SON50P400X400X100-13N-D +R38 RES1005@1005 +C62 CAP1005@1005 +C65 CAP1005@1005 +C70 CAP1005@1005 +C74 CAP1005@1005 +U26 NRF52840_QIAA_R@NRF52840-QIAA-F-R7 +U3 MCP73838@MSOP10-MCP73838 +C73 CAP1005@1005 +C11 CAP1608@1608 +C75 CAP1005@1005 +U31 MAX14778ETP+@QFN65P500X500X80-21N +C76 CAP1005@1005 +C77 CAP1005@1005 +R58 RES1005@1005 +C33 CAP1608@1608 +R73 RES1005@1005 +R63 RES1005@1005 +U34 MD0100N8-G@AMP_PHA-1 +C80 CAP1005@1005 +C81 CAP1005@1005 +PZT_PE TEST_POINT@TP +PZT_DMP TEST_POINT@TP +PZT_PIN TEST_POINT@TP +PZT_NIN TEST_POINT@TP +C82 CAP1005@1005 +C83 CAP1005@1005 +PZT_T/R TEST_POINT@TP +C84 CAP1005@1005 +L10 IND1608@1608 +L11 IND1608@1608 +L12 IND1608@1608 +L14 IND1608@1608 +C1 CAP1608@1608 +U32 LT3463EDDPBF@DFN-10_DD +C3 CAP1608@1608 +C6 CAP1608@1608 +R7 RES1005@1005 +L13 IND1608@1608 +R10 RES1005@1005 +R9 RES1005@1005 +R5 RES1005@1005 +L15 IND1608@1608 +TH1 THER1608@TH1608-NB21K00103KBB +R13 RES1005@1005 +C85 CAP1005@1005 +C86 CAP1005@1005 +D1 B0540WS-TP@SOD2512X115N +R66 RES1005@1005 +R67 RES1005@1005 +C87 CAP1005@1005 +R68 RES1005@1005 +R69 RES1005@1005 +R70 RES1005@1005 +R71 RES1005@1005 +C88 CAP1005@1005 +C89 CAP1005@1005 +C79 CAP1005@1005 +L16 IND1608@1608 +U33 MCP1804T-A002I_OT@SOT95P270X145-5N +C90 CAP1005@1005 +C91 CAP1005@1005 +C98 CAP1005@1005 +R1 RES1005@1005 +R2 RES1005@1005 +LED1 LED1608@LED1608 +LED2 LED1608@LED1608 +L17 IND1608@1608 +R3 RES1005@1005 +R74 RES1005@1005 +C110 CAP1005@1005 +R77 RES1005@1005 +C119 CAP1005@1005 +R79 RES1005@1005 +R80 RES1005@1005 +U37 ADC121S051CIMF_NOPB@SOT95P280X145-6N +C78 CAP1005@1005 +C93 CAP1005@1005 +C95 CAP1005@1005 +T1 TEST_POINT@TP +T2 TEST_POINT@TP +T3 TEST_POINT@TP +L19 IND1608@1608 +U38 LM27762DSSR@SON50P200X300X80-13N-D +U42 MIC5528-3.3YMT@MIC5528-3.3YMT +C96 CAP1005@1005 +R64 RES1005@1005 +R72 RES1005@1005 +R76 RES1005@1005 +R78 RES1005@1005 +R81 RES1005@1005 +L20 IND1608@1608 +R82 RES1005@1005 +L22 IND1608@1608 +L23 IND1608@1608 +C102 CAP1005@1005 +U41 MIC5528-3.3YMT@MIC5528-3.3YMT +C104 CAP1608@1608 +L32 IND1608@1608 +R61 RES1005@1005 +C121 CAP1005@1005 +R84 RES1005@1005 +C105 CAP1005@1005 +R87 RES1005@1005 +C106 CAP1005@1005 +T4 TEST_POINT@TP +T6 TEST_POINT@TP +CS TEST_POINT@TP +MISO TEST_POINT@TP +SCLK TEST_POINT@TP +R90 RES1005@1005 +C109 CAP1005@1005 +C113 CAP1608@1608 +L31 IND1608@1608 +C114 CAP1005@1005 +C115 CAP1608@1608 +C116 CAP1608@1608 +*NET* +*SIGNAL* 2NDAMP_IN +C78.1 U2.7 R82.2 +*SIGNAL* $$$21938 +U31.1 R11.2 +*SIGNAL* $$$26420 +C51.2 U23.4 U23.1 L1.1 C42.1 +*SIGNAL* 2NDAMP_OUT +U2.9 R80.2 T4.1 C40.2 +*SIGNAL* GND +C16.2 C17.2 C18.1 Y2.4 Y2.2 +C21.1 C22.1 C28.1 C19.1 U26.B7 +C20.1 C31.1 C24.1 C29.2 C30.2 +C32.2 C36.1 C26.1 C14.1 C25.1 +U26.F23 C27.1 U10.7 U10.6 C34.1 +C33.2 C35.1 U10.1 U10.2 U10.3 +U10.10 U10.11 J1.5 C72.1 C73.1 +U9.1 U9.2 C15.1 U26.74 U16.4 +U16.9 C53.1 R41.2 C11.2 U5.3 +C8.2 R17.2 C9.2 R15.2 R21.2 +U5.5 U3.5 TH1.2 R7.2 R13.2 +R10.2 C6.2 C1.2 J2.2 U1.1 +C3.2 R29.1 C23.1 C121.1 R4.2 +C65.1 U22.3 C119.1 J4.A1/B12 J4.A12/B1 +J4.SH2 J4.SH1 R37.2 R38.2 U27.17 +U27.3 U27.6 U27.7 U27.14 U30.12 +U30.9 U30.13 U31.3 C77.1 C82.2 +C48.1 C76.1 C84.1 C85.2 U32.11 +R71.2 C88.2 C89.2 U33.2 C90.2 +C91.2 C79.2 C104.2 U42.3 R65.2 +C98.2 U42.5 C114.2 C115.2 C81.1 +C80.1 C38.2 C47.2 C83.2 C49.1 +R6.2 P1.8 P1.4 P1.7 P1.3 +U41.3 C113.2 U41.5 C116.2 R77.1 +R79.1 U37.2 C95.1 U38.13 C10.2 +R76.1 R81.2 U38.4 C52.2 C7.2 +C5.2 C102.1 R83.2 C105.2 C106.2 +C109.2 R3.1 C93.1 R82.1 C4.1 +C2.1 U20.2 C12.1 C13.2 C37.2 +U23.17 C64.1 U23.10 U23.5 U23.6 +U23.7 U23.8 U23.16 U23.15 U23.13 +C67.2 R26.2 R27.1 C51.1 C39.2 +R36.2 C41.2 C42.2 C43.2 C44.2 +C45.2 C46.2 C50.2 C54.1 C55.1 +C56.2 J2.3 J2.4 U5.7 U8.3 +U3.11 U42.7 +*SIGNAL* PREAMP_OUT +R74.2 C103.2 T2.1 U2.1 +*SIGNAL* SWDIO +U26.AC24 J1.2 +*SIGNAL* INT2_ICM +U26.G1 R31.2 U10.9 +*SIGNAL* SWDCLK +U26.AA24 J1.4 +*SIGNAL* $$$7457 +U23.2 C61.1 +*SIGNAL* $$$3365 +R43.2 LED4.1 +*SIGNAL* $$$7588 +R19.2 R20.1 U23.12 +*SIGNAL* $$$4037 +J4.A4/B9 U6.1 J4.A9/B4 +*SIGNAL* $$$3654 +U42.2 L32.1 U42.1 +*SIGNAL* PWR_MCU_EN +R17.1 U5.4 C9.1 R22.2 D3.1 +*SIGNAL* $$$14862 +C64.2 U23.14 +*SIGNAL* \SPI_CS_LOCK-IN +U26.AD8 +*SIGNAL* SYNCO +U26.AD12 +*SIGNAL* ADC_RDATA_N +U26.B13 +*SIGNAL* ADC_RDATA_P +U26.A12 +*SIGNAL* XL1 +C16.1 Y1.2 U26.D2 +*SIGNAL* I2C_SCL_ICM +U26.B15 U10.13 R34.2 +*SIGNAL* XL2 +C17.1 Y1.1 U26.F2 +*SIGNAL* $$$25958 +L3.2 U26.E24 C14.2 C15.2 U26.B5 +*SIGNAL* VDD_BAT +C6.1 J2.1 U3.10 U4.4 R28.2 +*SIGNAL* $$$22393 +R90.2 C109.1 U38.12 U38.8 +*SIGNAL* SPI_SCK +U26.AC9 U16.6 R18.1 +*SIGNAL* $$$32490 +R23.2 LED3.1 +*SIGNAL* $$$15263 +U23.3 C67.1 +*SIGNAL* SPI_MOSI +U26.AC11 U16.5 +*SIGNAL* VBUS_IN +U1.4 L2.1 U6.2 +*SIGNAL* $$$15328 +R20.2 R26.1 U23.11 +*SIGNAL* $$$24450 +U3.8 R5.2 R10.1 +*SIGNAL* $$$20152 +R35.1 R27.2 U23.9 +*SIGNAL* RXD +U26.M2 J1.6 +*SIGNAL* TXD +U26.L1 J1.3 +*SIGNAL* $$$16529 +U26.H23 C25.2 L5.2 +*SIGNAL* ADC_TEMP +U26.K2 U22.2 C119.2 +*SIGNAL* I2C_SCL_NIR +U26.L24 R25.1 +*SIGNAL* PWR_HOLD +U26.N1 D4.2 +*SIGNAL* I2C_SDA_NIR +U26.J24 R24.1 +*SIGNAL* $$$22557 +CS.1 U37.6 R8.2 R14.2 +*SIGNAL* VBUS +U4.5 JP1.2 R15.1 U3.1 U3.7 +R5.1 C1.1 LED2.2 LED1.2 L2.2 +*SIGNAL* SPI_MISO +U26.AD10 U16.2 R16.1 +*SIGNAL* $$$5070 +U4.3 U4.6 U4.7 U4.8 U7.1 +*SIGNAL* INT1_ICM +U10.4 R32.2 U26.A16 +*SIGNAL* $$$22594 +MISO.1 U37.5 R16.2 +*SIGNAL* $$$6539 +L4.2 L3.1 +*SIGNAL* $$$12824 +R19.1 R87.2 +*SIGNAL* ANT +C26.2 U9.3 L5.1 C28.2 C27.2 +*SIGNAL* $$$12989 +R36.1 R39.2 C40.1 +*SIGNAL* $$$3572 +U27.16 U27.1 PZT_DMP.1 R12.2 +*SIGNAL* $$$25431 +U26.C1 C18.2 +*SIGNAL* $$$6537 +L4.1 U26.B3 +*SIGNAL* VCC_NRF +C32.1 U26.AD2 +*SIGNAL* $$$22610 +SCLK.1 U37.4 R18.2 +*SIGNAL* $$$12990 +R39.1 C41.1 T5.1 C61.2 +*SIGNAL* I2C_SDA_ICM +U26.A14 U10.14 R33.2 +*SIGNAL* $$$85 +U3.2 C3.1 +*SIGNAL* $$$1313 +U3.6 R7.1 +*SIGNAL* \WP_FLASH +U26.H2 U16.3 R41.1 +*SIGNAL* $$$18796 +R38.1 J4.B5 +*SIGNAL* $$$18801 +R37.1 J4.A5 +*SIGNAL* $$$1329 +TH1.1 R13.1 R9.2 +*SIGNAL* $$$16790 +R9.1 U3.9 +*SIGNAL* $$$3604 +U27.5 PZT_NIN.1 R40.2 +*SIGNAL* $$$3606 +U27.4 PZT_PIN.1 R30.2 +*SIGNAL* ADC_BAT +U26.J1 R28.1 R29.2 C23.2 +*SIGNAL* VDD_MAIN +SW2.1 C8.1 U7.2 U5.6 U42.6 +C115.1 U41.6 C116.1 C54.2 +*SIGNAL* $$$26274 +U26.N24 C24.2 +*SIGNAL* PZT_EN_MUXB +U26.AC19 U31.16 +*SIGNAL* \SPI_CS_FLASH +U26.AD20 R42.1 U16.1 +*SIGNAL* $$$20341 +JP1.1 U4.1 +*SIGNAL* $$$18101 +R61.1 C121.2 D3.3 +*SIGNAL* PWR_I/R_EN +U26.T2 +*SIGNAL* LIGHT_ON +U26.AD18 +*SIGNAL* $$$27542 +U26.AC5 C30.1 +*SIGNAL* $$$18102 +D3.2 U8.2 R21.1 +*SIGNAL* BUTTON_CHECK +U26.P2 U8.4 +*SIGNAL* $$$18103 +R22.1 D4.1 +*SIGNAL* LED_BLE +U26.U1 R23.1 +*SIGNAL* NIRLED_SEL0 +U26.U24 +*SIGNAL* NIRLED_SEL1 +U26.T23 +*SIGNAL* $$$4032 +U5.2 U5.1 L6.1 +*SIGNAL* GND_RX +U41.7 +*SIGNAL* $$$14845 +U26.D23 C72.2 +*SIGNAL* $$$14940 +C73.2 U26.A18 +*SIGNAL* $$$3432 +R61.2 R4.1 SW2.2 +*SIGNAL* FUNCTION_LED +U26.A10 R43.1 +*SIGNAL* $$$20788 +L23.1 U2.4 C102.2 C37.1 +*SIGNAL* ADC_PRESSURE +U26.A8 +*SIGNAL* $$$14839 +U27.8 C62.1 +*SIGNAL* $$$14847 +C62.2 U30.5 +*SIGNAL* +3.3V_M +C19.2 U26.A22 U26.AD23 C29.1 U26.Y2 +R25.2 U26.AD14 C33.1 C35.2 R33.1 +R34.1 R32.1 U10.12 C34.2 U10.5 +R31.1 R24.2 J1.1 U10.8 C20.2 +U26.B1 C31.2 U26.W1 C36.2 U16.7 +U16.8 C53.2 R42.2 L6.2 C11.1 +LED3.2 LED4.2 U8.6 +*SIGNAL* STAT1_1 +R1.2 U3.3 +*SIGNAL* STAT1_2 +U3.4 R2.2 +*SIGNAL* $$$30190 +R1.1 LED1.1 +*SIGNAL* $$$30191 +R2.1 LED2.1 +*SIGNAL* $$$14861 +C70.1 U27.9 +*SIGNAL* NIR_WAV_SEL0 +U26.Y23 +*SIGNAL* $$$14864 +C70.2 U30.3 +*SIGNAL* $$$14885 +U27.12 C74.1 +*SIGNAL* $$$14887 +C74.2 U30.2 +*SIGNAL* ADC_AGC +U26.B9 +*SIGNAL* AGC_SW +U26.AD16 +*SIGNAL* $$$14896 +U27.13 C75.1 +*SIGNAL* $$$14902 +C75.2 U30.1 +*SIGNAL* $$$25289 +U30.6 C82.1 L11.1 C48.2 +*SIGNAL* PZT_-20V +L12.2 D1.A R68.1 C89.1 +*SIGNAL* $$$25231 +U27.10 U27.11 L10.1 U27.2 C81.2 +C80.2 +*SIGNAL* PZT_PE +U26.AC21 U27.15 R6.1 PZT_PE.1 +*SIGNAL* PZT_DMP +U26.AD22 R12.1 +*SIGNAL* PZT_P_PULSE +U26.P23 R30.1 +*SIGNAL* PZT_N_PULSE +U26.R24 R40.1 +*SIGNAL* $$$2625 +U31.2 C77.2 +*SIGNAL* PD_SEL0 +U26.B17 +*SIGNAL* $$$2626 +U31.4 U31.21 C76.2 +*SIGNAL* $$$2708 +U30.11 U30.8 U30.10 R58.1 U30.7 +*SIGNAL* PZT_RX +R58.2 PZT_T/R.1 U31.5 R11.1 U34.1 +*SIGNAL* $$$25617 +L22.1 U2.10 U2.5 U2.6 C93.2 +C13.1 +*SIGNAL* $$$24188 +R3.2 U2.2 R74.1 +*SIGNAL* $$$24714 +R77.2 T1.1 C110.1 U2.3 +*SIGNAL* PD_SEL1 +U26.B19 +*SIGNAL* $$$5663 +U34.3 U20.1 C110.2 +*SIGNAL* $$$7726 +R79.2 U2.8 R80.1 +*SIGNAL* $$$6258 +U31.9 P1.6 +*SIGNAL* $$$6259 +U31.8 P1.5 +*SIGNAL* $$$6260 +U31.7 P1.2 +*SIGNAL* PZT_CH_SEL1 +U26.B11 U31.14 U31.12 +*SIGNAL* PZT_CH_SEL0 +U26.A20 U31.15 U31.11 +*SIGNAL* $$$6261 +U31.6 P1.1 +*SIGNAL* PZT_EN_MUXA +U26.AC17 U31.10 +*SIGNAL* PZT_+10V +L10.2 U33.5 C91.1 +*SIGNAL* PZT_+20V +L11.2 U32.1 R69.1 C88.1 L17.1 +*SIGNAL* $$$6264 +U31.19 P1.10 +*SIGNAL* $$$6265 +U31.20 P1.9 +*SIGNAL* $$$13633 +U33.4 C79.1 R73.2 +*SIGNAL* NIR_WAV_SEL1 +U26.W24 +*SIGNAL* NIR_WAV_SEL2 +U26.V23 +*SIGNAL* $$$13703 +R63.1 U32.8 U32.9 C114.1 +*SIGNAL* $$$26435 +C21.2 Y2.1 U26.A23 +*SIGNAL* $$$26436 +C22.2 Y2.3 U26.B24 +*SIGNAL* $$$25419 +C84.2 L14.1 U31.13 +*SIGNAL* $$$25322 +C83.1 U30.4 C49.2 L12.1 +*SIGNAL* $$$26511 +C95.2 U37.1 C39.1 L19.1 +*SIGNAL* +3.3V_PZT_TX +U22.1 C65.2 L14.2 R73.1 R63.2 +L32.2 C104.1 C47.1 L16.2 +*SIGNAL* $$$19431 +U32.2 L13.2 +*SIGNAL* $$$19433 +L15.2 C86.1 U32.4 +*SIGNAL* $$$25510 +U32.3 L15.1 C85.1 L16.1 L13.1 +C38.1 +*SIGNAL* $$$19894 +U32.5 C86.2 D1.C +*SIGNAL* $$$27698 +R66.1 U32.7 +*SIGNAL* PZT_PWR_EN +U26.R1 R65.1 U42.4 C98.1 U41.4 +*SIGNAL* $$$27702 +R66.2 U32.6 R67.2 C87.1 +*SIGNAL* $$$2967 +C87.2 R67.1 R68.2 +*SIGNAL* $$$3237 +R69.2 R70.1 +*SIGNAL* $$$3259 +R70.2 R71.1 U32.10 +*SIGNAL* $$$3655 +U41.2 L31.1 U41.1 C56.1 +*SIGNAL* +3.3V_PZT_RX +L31.2 C113.1 R90.1 R8.1 R35.2 +C45.1 L1.2 C46.1 L19.2 C50.1 +L20.2 C55.2 +*SIGNAL* +2.75V_CP +U38.11 R72.2 L22.2 C2.2 C7.1 +C44.1 +*SIGNAL* -2.75V_CP +U38.6 R78.1 C5.1 L23.2 C4.2 +C43.1 +*SIGNAL* $$$14934 +C96.1 U38.10 +*SIGNAL* $$$14941 +C96.2 U38.9 +*SIGNAL* $$$15655 +U38.1 R64.2 +*SIGNAL* $$$17850 +U38.3 R64.1 L20.1 C10.1 C12.2 +*SIGNAL* $$$16265 +R72.1 U38.2 R76.2 +*SIGNAL* $$$16444 +U38.7 R81.1 R78.2 +*SIGNAL* $$$16815 +C52.1 U38.5 +*SIGNAL* $$$20303 +R83.1 R84.2 C103.1 +*SIGNAL* $$$20306 +R84.1 C105.1 T3.1 C78.2 +*SIGNAL* \PZT_SPI_CS +U26.AC15 R14.1 +*SIGNAL* $$$22044 +R87.1 C106.1 U37.3 T6.1 +*SIGNAL* $$$25374 +U33.1 L17.2 C90.1 + +*MISC* MISCELLANEOUS PARAMETERS + +*REMARK* PARENT_KEYWORD PARENT_VALUE +*REMARK* [ { +*REMARK* CHILD_KEYWORD CHILD_VALUE +*REMARK* [ CHILD_KEYWORD CHILD_VALUE +*REMARK* [ { +*REMARK* GRAND_CHILD_KEYWORD GRAND_CHILD_VALUE [...] +*REMARK* } ]] +*REMARK* } ] + +LAYER METRIC +{ +LAYER 0 +{ +LAYER_THICKNESS 0 +DIELECTRIC 3.300000 +} +LAYER 1 +{ +LAYER_NAME Top Component +LAYER_TYPE ROUTING +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +ASSOCIATED_SILK_SCREEN Silkscreen Top +ASSOCIATED_PASTE_MASK Paste Mask Top +ASSOCIATED_SOLDER_MASK Solder Mask Top +ASSOCIATED_ASSEMBLY Assembly Drawing Top +COMPONENT Y +ROUTABLE Y +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0.254 +COPPER_THICKNESS 0.03429 +DIELECTRIC 4.300000 +COST 0 +} +LAYER 2 +{ +LAYER_NAME Inner Layer 2 +LAYER_TYPE ROUTING +PLANE NONE +ROUTING_DIRECTION VERTICAL +ROUTABLE Y +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0.254 +COPPER_THICKNESS 0.03429 +DIELECTRIC 4.300000 +COST 0 +} +LAYER 3 +{ +LAYER_NAME Inner Layer 3 +LAYER_TYPE ROUTING +PLANE NONE +ROUTING_DIRECTION HORIZONTAL +ROUTABLE Y +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0.254 +COPPER_THICKNESS 0.03429 +DIELECTRIC 4.300000 +COST 0 +} +LAYER 4 +{ +LAYER_NAME Bottom Component +LAYER_TYPE ROUTING +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +ASSOCIATED_SILK_SCREEN Silkscreen Bottom +ASSOCIATED_PASTE_MASK Paste Mask Bottom +ASSOCIATED_SOLDER_MASK Solder Mask Bottom +ASSOCIATED_ASSEMBLY Assembly Drawing Bottom +COMPONENT Y +ROUTABLE Y +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0.03429 +DIELECTRIC 3.300000 +COST 0 +} +LAYER 5 +{ +LAYER_NAME Layer_5 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION HORIZONTAL +ENABLED Y +LAYER_THICKNESS 0.254 +COPPER_THICKNESS 0.03429 +DIELECTRIC 4.300000 +COST 0 +} +LAYER 6 +{ +LAYER_NAME Layer_6 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +ASSOCIATED_SILK_SCREEN Silkscreen Bottom +ASSOCIATED_PASTE_MASK Paste Mask Bottom +ASSOCIATED_SOLDER_MASK Solder Mask Bottom +ASSOCIATED_ASSEMBLY Assembly Drawing Bottom +COMPONENT Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0.03429 +DIELECTRIC 3.300000 +COST 0 +} +LAYER 7 +{ +LAYER_NAME Layer_7 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 8 +{ +LAYER_NAME Layer_8 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 9 +{ +LAYER_NAME Layer_9 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 10 +{ +LAYER_NAME Layer_10 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 11 +{ +LAYER_NAME Layer_11 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 12 +{ +LAYER_NAME Layer_12 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 13 +{ +LAYER_NAME Layer_13 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 14 +{ +LAYER_NAME Layer_14 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 15 +{ +LAYER_NAME Layer_15 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 16 +{ +LAYER_NAME Layer_16 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 17 +{ +LAYER_NAME Layer_17 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 18 +{ +LAYER_NAME Layer_18 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 19 +{ +LAYER_NAME Layer_19 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 20 +{ +LAYER_NAME Layer_20 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 21 +{ +LAYER_NAME Solder Mask Top +LAYER_TYPE SOLDER_MASK +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 22 +{ +LAYER_NAME Paste Mask Bottom +LAYER_TYPE PASTE_MASK +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 23 +{ +LAYER_NAME Paste Mask Top +LAYER_TYPE PASTE_MASK +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 24 +{ +LAYER_NAME Drill Drawing +LAYER_TYPE DRILL +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 25 +{ +LAYER_NAME Layer_25 +LAYER_TYPE UNASSIGNED +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 26 +{ +LAYER_NAME Silkscreen Top +LAYER_TYPE SILK_SCREEN +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 27 +{ +LAYER_NAME Assembly Drawing Top +LAYER_TYPE ASSEMBLY +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 28 +{ +LAYER_NAME Solder Mask Bottom +LAYER_TYPE SOLDER_MASK +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 29 +{ +LAYER_NAME Silkscreen Bottom +LAYER_TYPE SILK_SCREEN +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +LAYER 30 +{ +LAYER_NAME Assembly Drawing Bottom +LAYER_TYPE ASSEMBLY +PLANE NONE +ROUTING_DIRECTION NO_PREFERENCE +VISIBLE Y +SELECTABLE Y +ENABLED Y +LAYER_THICKNESS 0 +COPPER_THICKNESS 0 +DIELECTRIC 0.000000 +COST 0 +} +} +*REMARK* PARENT_KEYWORD PARENT_VALUE +*REMARK* [ { +*REMARK* CHILD_KEYWORD CHILD_VALUE +*REMARK* [ CHILD_KEYWORD CHILD_VALUE +*REMARK* [ { +*REMARK* GRAND_CHILD_KEYWORD GRAND_CHILD_VALUE [...] +*REMARK* } ]] +*REMARK* } ] + +RULES_SECTION METRIC +{ +NET_CLASS DATA +DESIGN RULES +{ +RULE_SET (1) +{ +FOR : +{ +DEFAULT : +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.1 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (2) +{ +FOR : +{ +DEFAULT : +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +ROUTE_RULE : +{ +LENGTH_MINIMIZATION_TYPE 1 +TRACE_SHARE Y +VIA_SHARE Y +AUTO_ROUTE Y +RIPUP Y +SHOVE Y +ROUTE_PRIORITY 3 +MAX_NUMBER_OF_VIAS -1 +VALID_LAYER 1 +VALID_LAYER 2 +VALID_LAYER 3 +VALID_LAYER 4 +VALID_VIA_TYPE MICROVIA +VALID_VIA_TYPE STANDARDVIA +VALID_VIA_TYPE NOPLATED +VALID_VIA_TYPE GUIDEHOLE +} +} +RULE_SET (3) +{ +FOR : +{ +DEFAULT : +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +HIGH_SPEED_RULE : +{ +MIN_LENGTH 0 +MAX_LENGTH 1269.99996 +STUB_LENGTH 0 +PARALLEL_LENGTH 25.4 +PARALLEL_GAP 5.08 +TANDEM_LENGTH 25.4 +TANDEM_GAP 5.08 +MIN_DELAY 0.000000 +MAX_DELAY 10.000000 +MIN_CAPACITANCE 0.000000 +MAX_CAPACITANCE 10.000000 +MIN_IMPEDANCE 50.000000 +MAX_IMPEDANCE 150.000000 +SHIELD_NET * +SHIELD_GAP 5.08 +MATCH_LENGTH_TOLERANCE 5.08 +} +} +RULE_SET (4) +{ +FOR : +{ +NET VDD_BAT +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.15 +OUTLINE_TO_VIA 0.15 +OUTLINE_TO_PAD 0.15 +OUTLINE_TO_SMD 0.15 +OUTLINE_TO_COPPER 0.15 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.2 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (5) +{ +FOR : +{ +NET ANT +NET $$$16529 +NET $$$3606 +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.3 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (6) +{ +FOR : +{ +NET +3.3V_M +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.3 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (7) +{ +FOR : +{ +NET GND +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.2 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (8) +{ +FOR : +{ +NET ADC_BAT +NET VDD_BAT +NET $$$14940 +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.5 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (9) +{ +FOR : +{ +NET $$$6537 +NET $$$6539 +NET $$$25431 +NET $$$25958 +NET $$$26274 +NET $$$27542 +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.2 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (10) +{ +FOR : +{ +NET VBUS +NET $$$12824 +NET \SPI_CS_FLASH +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.5 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (11) +{ +FOR : +{ +NET $$$85 +NET $$$1313 +NET $$$1329 +NET $$$24450 +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.3 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (12) +{ +FOR : +{ +NET VDD_MAIN +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.3 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (14) +{ +FOR : +{ +NET ADC_AGC +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.3 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +RULE_SET (15) +{ +FOR : +{ +NET ADC_RDATA_N +NET ADC_RDATA_P +} +AGAINST : +{ +DEFAULT : +} +LAYER 0 +CLEARANCE_RULE : +{ +TRACK_TO_TRACK 0.1 +VIA_TO_TRACK 0.1 +VIA_TO_VIA 0.1 +PAD_TO_TRACK 0.1 +PAD_TO_VIA 0.1 +PAD_TO_PAD 0.1 +SMD_TO_TRACK 0.1 +SMD_TO_VIA 0.1 +SMD_TO_PAD 0.1 +SMD_TO_SMD 0.1 +COPPER_TO_TRACK 0.1 +COPPER_TO_VIA 0.1 +COPPER_TO_PAD 0.1 +COPPER_TO_SMD 0.1 +COPPER_TO_COPPER 0.1 +TEXT_TO_TRACK 0.1 +TEXT_TO_VIA 0.1 +TEXT_TO_PAD 0.1 +TEXT_TO_SMD 0.1 +OUTLINE_TO_TRACK 0.2 +OUTLINE_TO_VIA 0.2 +OUTLINE_TO_PAD 0.2 +OUTLINE_TO_SMD 0.2 +OUTLINE_TO_COPPER 0.2 +DRILL_TO_TRACK 0.1 +DRILL_TO_VIA 0.1 +DRILL_TO_PAD 0.1 +DRILL_TO_SMD 0.1 +DRILL_TO_COPPER 0.1 +SAME_NET_SMD_TO_VIA 0.1 +SAME_NET_SMD_TO_CRN 0.1 +SAME_NET_VIA_TO_VIA 0.1 +SAME_NET_PAD_TO_CRN 0.1 +MIN_TRACK_WIDTH 0.1 +REC_TRACK_WIDTH 0.3 +MAX_TRACK_WIDTH 1 +DRILL_TO_DRILL 0.1 +BODY_TO_BODY 0.1 +SAME_NET_TRACK_TO_CRN 0.1 +} +} +} +} + +*MISC* MISCELLANEOUS PARAMETERS + +ATTRIBUTE VALUES +{ +PART R31 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C17 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 12pF_1005 +"Tolerance" +"Voltage Rating" +} +PART U2 +{ +"Manufacturer_Name" Texas Instruments +"Value" OPA2836IDGSR +"Mouser Part Number" 595-OPA2836IDGSR +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Texas-Instruments/OPA2836IDGSR?qs=RqytGdBYyUGqgkd64C%252BPLQ%3D%3D +"Arrow Part Number" OPA2836IDGSR +"Arrow Price/Stock" https://www.arrow.com/en/products/opa2836idgsr/texas-instruments?utm_currency=USD®ion=europe +"Description" Dual, Very Low Power, Rail to Rail out, Negative Rail in, VFB Op Amp +"Datasheet Link" http://www.ti.com/lit/gpn/opa2836 +"Geometry.Height" 1.1mm +} +PART C18 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +"Tolerance" +"Voltage Rating" +} +PART J2 +{ +"Description" Battery Connector +"Manufacturer #1" MOLEX +"Value" 2026560021 +} +PART R23 +{ +"Value" 2k_1005_5% +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART R8 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART U9 +{ +"Manufacturer_Name" Taoglas +"Value" RECE.20279.001E.01 +"Mouser Part Number" 960-RECE20279001E01 +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Taoglas/RECE.20279.001E.01?qs=MyNHzdoqoQIdppWb9vcEBA%3D%3D +"Arrow Part Number" RECE.20279.001E.01 +"Arrow Price/Stock" https://www.arrow.com/en/products/rece.20279.001e.01/taoglas?utm_currency=USD®ion=nac +"Description" IPEX MHF Receptacle +"Datasheet Link" https://datasheet.datasheetarchive.com/originals/distributors/Datasheets-DGA15/760324.pdf +} +PART R11 +{ +"Value" 0_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C2 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART C30 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C4 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART R25 +{ +"Value" 4.7k_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART J4 +{ +"MF" ATTEND_Technology +"MAXIMUM_PACKAGE_HEIGHT" 5.46_mm +"Package" None +"Price" None +"Check_prices" https://www.snapeda.com/parts/217B-CA04/Attend/view-part/?ref=eda +"STANDARD" Manufacturer_Recommendations +"PARTREV" 1 +"SnapEDA_Link" https://www.snapeda.com/parts/217B-CA04/Attend/view-part/?ref=snap +"Value" 217B-CA04 +"Description" ______________________________________________________USB-C_(USB_TYPE-C)_Receptacle_Connector_24_(16+8_Dummy)_Position_Surface_Mount,_Right_Angle______________________________________________ +"Availability" In_Stock +"MANUFACTURER" Attend +"PKG_TYPE" ATTEND_217B-CA04 +} +PART J1 +{ +"Value" NC +} +PART C19 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 1uF_1005 +"Tolerance" +"Voltage Rating" +} +PART C16 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 12pF_1005 +"Tolerance" +"Voltage Rating" +} +PART C23 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 1nF_1005 +"Tolerance" +"Voltage Rating" +} +PART R28 +{ +"Value" 806k_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART R42 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R6 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R12 +{ +"Value" 48.7_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART U5 +{ +"Description" High Performance 500 mA LDO +"Manufacturer #1" MICROCHIP +"Value" MIC5528-3.3YMT +} +PART C21 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 12pF_1005 +"Tolerance" +"Voltage Rating" +} +PART C22 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 12pF_1005 +"Tolerance" +"Voltage Rating" +} +PART C31 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +"Tolerance" +"Voltage Rating" +} +PART R14 +{ +"Value" 0_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART LED3 +{ +"Description" LED GREEN/1608 +"Value" FC-DA1608UGK-520D10 +"Manufacturer #1" ANY VENDOR +} +PART C32 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C20 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +"Tolerance" +"Voltage Rating" +} +PART R16 +{ +"Value" 0_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R18 +{ +"Value" 0_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART U20 +{ +"Manufacturer_Name" Nexperia +"Value" PESD5V0F1BLD,315 +"Mouser Part Number" 771-PESD5V0F1BLD315 +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Nexperia/PESD5V0F1BLD315?qs=1sbE9T7hb3b3MsEvtkPidA%3D%3D +"Arrow Part Number" PESD5V0F1BLD,315 +"Arrow Price/Stock" https://www.arrow.com/en/products/pesd5v0f1bld315/nexperia?region=nac +"Description" PESD5V0F1BLD - Femtofarad bidirectional ESD protection diode +"Datasheet Link" https://assets.nexperia.com/documents/data-sheet/PESD5V0F1BLD.pdf +"Geometry.Height" 0.4mm +} +PART C15 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 47nF_1005 +"Tolerance" +"Voltage Rating" +} +PART C24 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 820pF_1005 +"Tolerance" +"Voltage Rating" +} +PART C5 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10uF_1608 +"Tolerance" +"Voltage Rating" +} +PART C7 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C10 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608 +"Tolerance" +"Voltage Rating" +} +PART C14 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 1uF_1005 +"Tolerance" +"Voltage Rating" +} +PART C12 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART C13 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C37 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C38 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART U23 +{ +"Manufacturer_Name" Analog Devices +"Value" ADL5513ACPZ-R7 +"Mouser Part Number" 584-ADL5513ACPZ-R7 +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Analog-Devices/ADL5513ACPZ-R7?qs=BpaRKvA4VqGe6%2FPlUcoEpw%3D%3D +"Arrow Part Number" ADL5513ACPZ-R7 +"Arrow Price/Stock" https://www.arrow.com/en/products/adl5513acpz-r7/analog-devices?utm_currency=USD®ion=nac +"Description" ANALOG DEVICES - ADL5513ACPZ-R7 - DETECTOR, 1MHZ - 4GHZ, 80DB, LFCSP-16 +"Datasheet Link" https://www.analog.com/media/en/technical-documentation/data-sheets/ADL5513.pdf +"Geometry.Height" 0.8mm +} +PART C61 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 47nF_1005 +} +PART R19 +{ +"Value" 1k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R29 +{ +"Value" 2M_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART C64 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100pF_1005 +} +PART C67 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 47nF_1005 +} +PART R20 +{ +"Value" 0_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C72 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 100pF_1005 +"Tolerance" +"Voltage Rating" +} +PART C29 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART L4 +{ +"Manufacturer #1" TAIYO YUDEN +"Value" 10uH_1608 +"Description" RF INDUCTOR +"Part Number" LBMF1608T100K +} +PART L3 +{ +"Manufacturer #1" TAIYO YUDEN +"Value" 15nH_1005 +"Description" RF INDUCTOR +"Part Number" HK100515NJ-T +} +PART Y1 +{ +"Cost" +"Description" CRYSTAL FC-12M 32.768KHZ 20PPM,12.5PF +"Manufacturer #1" SEIKO EPSON +"Value" FC-12M 32.7680KA-A0 +"Geometry.Height" 1.27000mm +} +PART R26 +{ +"Value" NC +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R27 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART Y2 +{ +"Value" FA-128 32.0000MF10Z-AJ0 +"Manufacturer #1" SEIKO EPSON +"Cost" +"Description" CRYSTAL 2016 32MHz, 8PF(6PF), 10PPM +} +PART R35 +{ +"Value" 100k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C51 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART L1 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART C42 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C36 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +"Tolerance" +"Voltage Rating" +} +PART R24 +{ +"Value" 4.7k_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART C43 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C39 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C28 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" NC +"Tolerance" +"Voltage Rating" +} +PART C27 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" NC +"Tolerance" +} +PART R36 +{ +"Value" 1k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C26 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 0.5pF_1005 +"Tolerance" +"Voltage Rating" +} +PART C25 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 0.8pF_1005 +"Tolerance" +"Voltage Rating" +} +PART R39 +{ +"Value" 1k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C40 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100pF_1005 +} +PART C41 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 47pF_1005 +} +PART C44 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C45 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C46 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C47 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10uF_1608 +"Tolerance" +"Voltage Rating" +} +PART C48 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 1uF_1005_50V +} +PART C49 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 1uF_1005_50V +} +PART U16 +{ +"Manufacturer_Name" Winbond +"Value" W25Q32RVXHJQ TR +"Mouser Part Number" 454-W25Q32RVXHJQTR +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Winbond/W25Q32RVXHJQ-TR?qs=mELouGlnn3dFwM4lg8JCig%3D%3D +"Arrow Part Number" W25Q32RVXHJQ TR +"Arrow Price/Stock" https://www.arrow.com/en/products/w25q32rvxhjq-tr/winbond-electronics?utm_currency=USD®ion=nac +"Description" NOR Flash spiFlash, 3V, 32M-bit, 4Kb Uniform Sector +"Datasheet Link" https://www.winbond.com/hq/product/code-storage-flash-memory/serial-nor-flash/?__locale=ja&partNo=W25Q32RV +"Geometry.Height" 0.4mm +} +PART C50 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C103 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100pF_1005 +} +PART R83 +{ +"Value" 1k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C52 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608 +"Tolerance" +"Voltage Rating" +} +PART R30 +{ +"Value" 48.7_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C34 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +"Tolerance" +"Voltage Rating" +} +PART R40 +{ +"Value" 48.7_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART L5 +{ +"Manufacturer #1" MURATA +"Value" 4.7nH_1005 +"Description" RF INDUCTOR +"Part Number" LQP15MN3N9B02D +} +PART U6 +{ +"MF" Murata +"MAXIMUM_PACKAGE_HEIGHT" 0.95mm +"Package" 1608_Taiyo_Yuden +"Price" None +"Check_prices" https://www.snapeda.com/parts/PRG18BC1R0MM1RB/Murata/view-part/?ref=eda +"STANDARD" IPC-7351B +"PARTREV" N/A +"SnapEDA_Link" https://www.snapeda.com/parts/PRG18BC1R0MM1RB/Murata/view-part/?ref=snap +"Value" PRG18BC1R0MM1RB +"Description" ______________________________________________________Ceramic_PTC_Resettable_Fuse_6V_330_mA_Ih_Surface_Mount_0603_(1608_Metric)______________________________________________ +"Availability" In_Stock +"MANUFACTURER" Murata +"PKG_TYPE" THRMC1608X95N +} +PART U7 +{ +"MF" Murata +"MAXIMUM_PACKAGE_HEIGHT" 0.95mm +"Package" 1608_Taiyo_Yuden +"Price" None +"Check_prices" https://www.snapeda.com/parts/PRG18BC1R0MM1RB/Murata/view-part/?ref=eda +"STANDARD" IPC-7351B +"PARTREV" N/A +"SnapEDA_Link" https://www.snapeda.com/parts/PRG18BC1R0MM1RB/Murata/view-part/?ref=snap +"Value" PRG18BC1R0MM1RB +"Description" ______________________________________________________Ceramic_PTC_Resettable_Fuse_6V_330_mA_Ih_Surface_Mount_0603_(1608_Metric)______________________________________________ +"Availability" In_Stock +"MANUFACTURER" Murata +"PKG_TYPE" THRMC1608X95N +} +PART L6 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART SW2 +{ +"Value" NW3-A03-05 +"Manufacturer #1" MADE IN CHINA +"Description" TACTILE SWITCH +} +PART C53 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +"Tolerance" +"Voltage Rating" +} +PART R17 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R41 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C54 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART C55 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART C56 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10uF_1608 +"Tolerance" +"Voltage Rating" +} +PART R43 +{ +"Value" 2k_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART LED4 +{ +"Description" LED ORANGE/1608 +"Value" FC-DA1608HOK-600H +"Manufacturer #1" ANY VENDOR +} +PART U4 +{ +"Manufacturer #1" NEXPERIA +"Value" PMFPB8032XP +"Description" 20V, 3.7A P-channel MOSFET-Schottky +} +PART P1 +{ +"MANUFACTURER" Panasonic +"PKG_TYPE" PANASONIC_AXT510124 +} +PART R15 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART U10 +{ +"Description" 6-Axis MotionTracking IMU +"Manufacturer #1" TDK_INVENSENSE +"Value" ICM-42670-P +} +PART U27 +{ +"Manufacturer_Name" Microchip +"Value" MD1822K6-G +"Mouser Part Number" 689-MD1822K6-G +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Microchip-Technology/MD1822K6-G?qs=SPVxp5Gxk7pFYhy0Y%2FNrig%3D%3D +"Arrow Part Number" MD1822K6-G +"Arrow Price/Stock" https://www.arrow.com/en/products/md1822k6-g/microchip-technology?region=nac +"Description" MICROCHIP - MD1822K6-G - MOSFET Driver, High Side and Low Side, 5V to 10V Supply, 2A Out, 6.5ns Delay, QFN-16 +"Datasheet Link" https://ms.componentsearchengine.com/Datasheets/2/MD1822K6-G.pdf +"Geometry.Height" 1mm +} +PART C35 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +"Tolerance" +"Voltage Rating" +} +PART C8 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 2.2uF_1608 +"Tolerance" +"Voltage Rating" +} +PART C9 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART JP1 +{ +"Value" NC +} +PART R65 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART D3 +{ +"Description" DUAL SWITCHING DIODE +"Cost" +"Value" DAP222WM +"Manufacturer #1" ROHM KOREA. +} +PART D4 +{ +"Description" Medium Power AF Schottky Diode +"Manufacturer #1" INFINEON +"Value" BAS3005B-02V +} +PART U1 +{ +"Description" ESD protection diode +"Manufacturer #1" NEXPERIA +"Value" PRTR5V0U2X +} +PART R34 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART U22 +{ +"Description" High-Accuracy Analog Temperature Sensors +"Manufacturer #1" TI +"Value" TMP235AEDBZTQ1 +} +PART L2 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART R21 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R22 +{ +"Value" 100_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART U8 +{ +"Description" Single Inverter Gate +"Manufacturer #1" TI +"Value" SN74LVC1G04DRY2 +} +PART R33 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R32 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R37 +{ +"Value" 5.1K_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART R4 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART U30 +{ +"Manufacturer_Name" Microchip +"Value" TC7920K6-G +"Mouser Part Number" 689-TC7920K6-G +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Microchip-Technology/TC7920K6-G?qs=SPVxp5Gxk7rlZ7Pl2YwJVQ%3D%3D +"Arrow Part Number" TC7920K6-G +"Arrow Price/Stock" https://www.arrow.com/en/products/tc7920k6-g/microchip-technology +"Description" MOSFET 2PR N- & PCH ENHANCE MD MSFET w/DRAIN-DI +"Datasheet Link" https://4donline.ihs.com/images/VipMasterIC/IC/MCHP/MCHP-S-A0019419833/MCHP-S-A0019419833-1.pdf?hkey=EF798316E3902B6ED9A73243A3159BB0 +"Geometry.Height" 1mm +} +PART R38 +{ +"Value" 5.1K_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART C62 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 10nF_1005_50V +} +PART C65 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +"Tolerance" +"Voltage Rating" +} +PART C70 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 10nF_1005_50V +} +PART C74 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 10nF_1005_50V +} +PART U26 +{ +"Copyright" Copyright (C) 2025 Ultra Librarian. All rights reserved. +"Manufacturer_Name" Nordic Semiconductor +"Value" NRF52840-QIAA-F-R +} +PART U3 +{ +"Description" Advanced Stand-Alone Li-Ion/Li-Polymer Battery Charger +"Manufacturer #1" MICROCHIP +"Value" MCP73838-FCI/UN +} +PART C73 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" NC +"Tolerance" +"Voltage Rating" +} +PART C11 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 2.2uF_1608 +"Tolerance" +"Voltage Rating" +} +PART C75 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 10nF_1005_50V +} +PART U31 +{ +"Manufacturer_Name" Analog Devices +"Value" MAX14778ETP+ +"Mouser Part Number" 700-MAX14778ETP+ +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Analog-Devices-Maxim-Integrated/MAX14778ETP%2b?qs=4Rc5iGDDRGhnkuxvUsFiYQ%3D%3D +"Arrow Part Number" MAX14778ETP+ +"Arrow Price/Stock" https://www.arrow.com/en/products/max14778etp/analog-devices?utm_currency=USD®ion=nac +"Description" Maxim MAX14778ETP+, Multiplexer Dual 4:1 20Mbit/s, 3 5.5 V, 20-Pin TQFN +"Datasheet Link" https://datasheets.maximintegrated.com/en/ds/MAX14778.pdf +"Geometry.Height" 0.8mm +} +PART C76 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005_50V +} +PART C77 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005_50V +} +PART R58 +{ +"Value" 0_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C33 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 2.2uF_1608 +"Tolerance" +"Voltage Rating" +} +PART R73 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R63 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART U34 +{ +"Value" MD0100N8-G +} +PART C80 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 1uF_1005_50V +} +PART C81 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 1uF_1005_50V +} +PART C82 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005_50V +} +PART C83 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005_50V +} +PART C84 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005_50V +} +PART L10 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART L11 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART L12 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART L14 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART C1 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART U32 +{ +"MF" Analog_Devices +"VENDOR" Linear_Technology +"Description" ______________________________________________________Boost,_Charge_Pump_Switching_Regulator_IC_Positive_and_Negative_(Dual_Rail)_Adjustable_±1.25V_2_Output_180mA_(Switch),_320mA_(Switch)_10-WFDFN_Exposed_Pad______________________________________________ +"Package" DFN-10_Linear_Technology +"Price" None +"Check_prices" https://www.snapeda.com/parts/LT3463EDD%23PBF/Analog+Devices/view-part/?ref=eda +"SnapEDA_Link" https://www.snapeda.com/parts/LT3463EDD%23PBF/Analog+Devices/view-part/?ref=snap +"Value" LT3463EDD#PBF +"Availability" In_Stock +"MANUFACTURER_PART_NUMBER" lt3463edd +"PKG_TYPE" DFN-10_DD +} +PART C3 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART C6 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608_25V +"Tolerance" +"Voltage Rating" +} +PART R7 +{ +"Value" 4.7k_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART L13 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" 10uH_1608 +} +PART R10 +{ +"Value" NC +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART R9 +{ +"Value" 1.54k_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART R5 +{ +"Value" 1k_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART L15 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" 10uH_1608 +} +PART TH1 +{ +"Manufacturer #1" KYOCERA AVX +"Value" NB21K00103KBB +"Description" THERMISTOR NTC, 10K/1608 +} +PART R13 +{ +"Value" 69.8k_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART C85 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART C86 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005_50V +} +PART D1 +{ +"MAXIMUM_PACKAGE_HEIGHT" 1.15mm +"Value" B0540WS +} +PART R66 +{ +"Value" 61.9k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R67 +{ +"Value" 1M_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C87 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" NC +} +PART R68 +{ +"Value" 240k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R69 +{ +"Value" 240k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R70 +{ +"Value" 1M_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R71 +{ +"Value" 66.5k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C88 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 470nF_1005_50V +} +PART C89 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 470nF_1005_50V +} +PART C79 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 1uF_1005 +} +PART L16 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART U33 +{ +"Manufacturer_Name" Microchip +"Value" MCP1804T-A002I/OT +"Mouser Part Number" 579-MCP1804T-A002IOT +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Microchip-Technology/MCP1804T-A002I-OT?qs=X8nz4ozed5igIlf9%252BFEUbg%3D%3D +"Arrow Part Number" MCP1804T-A002I/OT +"Arrow Price/Stock" https://www.arrow.com/en/products/mcp1804t-a002iot/microchip-technology?region=nac +"Description" LDO, 150mA max, Vin 28V max, Vout =10.0V +"Datasheet Link" http://ww1.microchip.com/downloads/en/DeviceDoc/20002200D.pdf +"Geometry.Height" 1.45mm +} +PART C90 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 1uF_1005_50V +} +PART C91 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 1uF_1005_50V +} +PART C98 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART R1 +{ +"Value" 1k_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART R2 +{ +"Value" 1k_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART LED1 +{ +"Description" LED ORANGE/1608 +"Value" FC-DA1608HOK-600H +"Manufacturer #1" ANY VENDOR +} +PART LED2 +{ +"Description" LED BLUE/1608 +"Value" LS-SP192DNB74-D +"Manufacturer #1" ANY VENDOR +} +PART L17 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART R3 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R74 +{ +"Value" 100k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C110 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 10nF_1005 +} +PART R77 +{ +"Value" 1k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C119 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10nF_1005 +"Tolerance" +"Voltage Rating" +} +PART R79 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R80 +{ +"Value" 100k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART U37 +{ +"Manufacturer_Name" Texas Instruments +"Value" ADC121S051CIMF/NOPB +"Mouser Part Number" 926-AD121S051CIMFNPB +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Texas-Instruments/ADC121S051CIMF-NOPB?qs=7X5t%252BdzoRHDM6gt6xt2J%252Bw%3D%3D +"Arrow Part Number" ADC121S051CIMF/NOPB +"Arrow Price/Stock" https://www.arrow.com/en/products/adc121s051cimfnopb/texas-instruments?region=nac +"Description" Single Channel, 200 to 500 ksps, 12-Bit A/D Converter +"Datasheet Link" http://www.ti.com/lit/ds/symlink/adc121s051.pdf +"Geometry.Height" 1.45mm +} +PART C78 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART C93 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART C95 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART L19 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART U38 +{ +"Manufacturer_Name" Texas Instruments +"Value" LM27762DSSR +"Mouser Part Number" 595-LM27762DSSR +"Mouser Price/Stock" https://www.mouser.co.uk/ProductDetail/Texas-Instruments/LM27762DSSR?qs=vcbl%252BK4rRlfEJcC9xQ80sA%3D%3D +"Arrow Part Number" LM27762DSSR +"Arrow Price/Stock" https://www.arrow.com/en/products/lm27762dssr/texas-instruments?utm_currency=USD®ion=nac +"Description" LDO Voltage Regulators Low-Noise Positive- and Negative-Output Integrated Switched Capacitor Plus LDO 12-WSON -40 to 85 +"Datasheet Link" https://www.ti.com/lit/ds/symlink/lm27762.pdf +"Geometry.Height" 0.8mm +} +PART U42 +{ +"Description" High Performance 500 mA LDO +"Manufacturer #1" MICROCHIP +"Value" MIC5528-3.3YMT +} +PART C96 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 1uF_1005 +} +PART R64 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R72 +{ +"Value" 13k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R76 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R78 +{ +"Value" 13k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART R81 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART L20 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART R82 +{ +"Value" 1k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART L22 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART L23 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART C102 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART U41 +{ +"Description" High Performance 500 mA LDO +"Manufacturer #1" MICROCHIP +"Value" MIC5528-3.3YMT +} +PART C104 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 2.2uF_1608 +"Tolerance" +"Voltage Rating" +} +PART L32 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART R61 +{ +"Value" 100_1005 +"Manufacturer #1" ANY VENDOR +"Part Number" +"Description" SMT RESISTOR 1005, 1/16W +"Tolerance" +} +PART C121 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +"Tolerance" +"Voltage Rating" +} +PART R84 +{ +"Value" 1k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C105 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 47pF_1005 +} +PART R87 +{ +"Value" 1.54k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C106 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100pF_1005 +} +PART R90 +{ +"Value" 10k_1005 +"Manufacturer #1" ANY VENDOR +"Description" SMT RESISTOR 1005, 1/16W +} +PART C109 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART C113 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 4.7uF_1608 +"Tolerance" +"Voltage Rating" +} +PART L31 +{ +"Manufacturer #1" MURATA +"Description" CHIP FERRITE BEAD 120R/2A/1608 +"Value" BLM18PG330SH1D +} +PART C114 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Manufacturer #1" ANY VENDOR +"Value" 100nF_1005 +} +PART C115 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 2.2uF_1608 +"Tolerance" +"Voltage Rating" +} +PART C116 +{ +"Description" SURFACE MOUNT CAPACITOR 1005 +"Part Number" +"Manufacturer #1" ANY VENDOR +"Value" 10uF_1608 +"Tolerance" +"Voltage Rating" +} +} + +*END* OF ASCII OUTPUT FILE diff --git a/data/curcuit/20305 VB0HW0100.sch b/data/curcuit/20305 VB0HW0100.sch new file mode 100644 index 0000000..9cd4ee3 Binary files /dev/null and b/data/curcuit/20305 VB0HW0100.sch differ diff --git a/data/curcuit/VesiScan-Basic_curcuit.pdf b/data/curcuit/VesiScan-Basic_curcuit.pdf new file mode 100644 index 0000000..8d8766d Binary files /dev/null and b/data/curcuit/VesiScan-Basic_curcuit.pdf differ diff --git a/data/datasheet/W25Q32RV.pdf b/data/datasheet/W25Q32RV.pdf new file mode 100644 index 0000000..d857011 Binary files /dev/null and b/data/datasheet/W25Q32RV.pdf differ diff --git a/data/adc121s051_datasheet.pdf b/data/datasheet/adc121s051_datasheet.pdf similarity index 100% rename from data/adc121s051_datasheet.pdf rename to data/datasheet/adc121s051_datasheet.pdf diff --git a/pc_firm/dr_adc121s051/dr_adc121s051.c b/pc_firm/dr_adc121s051/dr_adc121s051.c index 6f5d80c..4210092 100644 --- a/pc_firm/dr_adc121s051/dr_adc121s051.c +++ b/pc_firm/dr_adc121s051/dr_adc121s051.c @@ -710,7 +710,6 @@ void dr_adc_print_buffer(const uint16_t *buffer, uint16_t num_samples) *============================================================================*/ /* External BLE NUS functions and variables from main.c */ -extern void binary_tx_handler(uint8_t const *ble_bin_buff, uint16_t length); extern void dr_binary_tx_safe(uint8_t const *ble_bin_buff, uint16_t length); extern void dr_sd_delay_ms(uint32_t ms); diff --git a/pc_firm/dr_util/dr_util.c b/pc_firm/dr_util/dr_util.c index 11317c6..c28fb8d 100644 --- a/pc_firm/dr_util/dr_util.c +++ b/pc_firm/dr_util/dr_util.c @@ -3,10 +3,7 @@ extern void single_format_data(uint8_t *buffer, const char *tag, uint16_t value); extern void format_data(uint8_t *buffer, const char *tag, uint16_t *data, uint8_t length); -extern void binary_tx_handler(uint8_t *buffer, uint8_t length); extern uint8_t ble_bin_buffer[]; - -/* Use dr_binary_tx_safe from main.c - has retry logic for BLE TX queue */ extern void dr_binary_tx_safe(uint8_t const *ble_bin_buff, uint16_t length); void dr_ble_return_1(const char *tag, uint16_t value) diff --git a/pc_firm/dr_w25q32/dr_w25q32.c b/pc_firm/dr_w25q32/dr_w25q32.c new file mode 100644 index 0000000..e40db23 --- /dev/null +++ b/pc_firm/dr_w25q32/dr_w25q32.c @@ -0,0 +1,533 @@ +/******************************************************************************* + * @file dr_w25q32.c + * @brief W25Q32 SPI Flash Driver for nRF52840 + * Software SPI (bit-bang) implementation + * @date 2026-03-12 + * + * @details Bit-bang SPI driver for W25Q32 NOR Flash. + * SPI Mode 0 (CPOL=0, CPHA=0): + * - SCLK idle LOW + * - Data sampled on rising edge + * - Data shifted out on falling edge + * + * W25Q32 SPI timing: + * CS ──┐ ┌── + * └────────────────────────────────────┘ + * CLK ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ + * ─────┘ └──┘ └──┘ └── ... ┘ └──┘ └──── + * DI ... + * DO ... + ******************************************************************************/ + +#include "dr_w25q32.h" +#include "nrf_gpio.h" +#include "nrf_delay.h" +#include "debug_print.h" +#include + +/*============================================================================== + * PRIVATE DEFINES + *============================================================================*/ + +#define DR_PIN_NUM(pin) ((pin) & 0x1F) +#define DR_PIN_PORT(pin) (((pin) >> 5) & 0x01) + +/* Pin masks for direct register access */ +#define FLASH_CS_MASK (1UL << DR_PIN_NUM(DR_FLASH_PIN_CS)) +#define FLASH_SCLK_MASK (1UL << DR_PIN_NUM(DR_FLASH_PIN_SCLK)) +#define FLASH_MISO_MASK (1UL << DR_PIN_NUM(DR_FLASH_PIN_MISO)) +#define FLASH_MOSI_MASK (1UL << DR_PIN_NUM(DR_FLASH_PIN_MOSI)) + +/* Port registers - all pins on P0 */ +#define FLASH_PORT NRF_P0 // NRF_P0: 포트 레지스터에 접근하는 베이스 포인터(포트 전체 제어 X) + +/* Timeout for busy wait (ms) */ +#define BUSY_TIMEOUT_PAGE_PROGRAM 10 +#define BUSY_TIMEOUT_SECTOR_ERASE 500 +#define BUSY_TIMEOUT_BLOCK_ERASE 2000 +#define BUSY_TIMEOUT_CHIP_ERASE 60000 + +/* W25Q32 JEDEC ID expected values */ +#define W25Q32_MANUFACTURER_ID 0xEF +#define W25Q32_MEMORY_TYPE 0x40 +#define W25Q32_CAPACITY 0x16 + +/*============================================================================== + * PRIVATE VARIABLES + *============================================================================*/ + +static bool m_initialized = false; + +/*============================================================================== + * LOW-LEVEL SPI BIT-BANG + * + * W25Q32 uses SPI Mode 0: + * - CPOL=0: Clock idle LOW + * - CPHA=0: Data sampled on rising edge, shifted on falling edge + *============================================================================*/ + +static inline void flash_cs_low(void) +{ + FLASH_PORT->OUTCLR = FLASH_CS_MASK; +} + +static inline void flash_cs_high(void) +{ + FLASH_PORT->OUTSET = FLASH_CS_MASK; +} + +static inline void flash_sclk_low(void) +{ + FLASH_PORT->OUTCLR = FLASH_SCLK_MASK; +} + +static inline void flash_sclk_high(void) +{ + FLASH_PORT->OUTSET = FLASH_SCLK_MASK; +} + +static inline void flash_mosi_high(void) +{ + FLASH_PORT->OUTSET = FLASH_MOSI_MASK; +} + +static inline void flash_mosi_low(void) +{ + FLASH_PORT->OUTCLR = FLASH_MOSI_MASK; +} + +static inline uint32_t flash_read_miso(void) +{ + return (FLASH_PORT->IN & FLASH_MISO_MASK) ? 1 : 0; +} + +/** + * @brief Send one byte via SPI (MSB first) + */ +static void spi_send_byte(uint8_t byte) +{ + for (int i = 7; i >= 0; i--) + { + /* Set MOSI */ + if (byte & (1 << i)) + flash_mosi_high(); + else + flash_mosi_low(); + + /* Rising edge - data sampled by slave */ + flash_sclk_high(); + __NOP(); + __NOP(); + + /* Falling edge */ + flash_sclk_low(); + __NOP(); + } +} + +/** + * @brief Receive one byte via SPI (MSB first) + * @note Sends 0xFF (MOSI high) while reading + */ +static uint8_t spi_recv_byte(void) +{ + uint8_t byte = 0; + + flash_mosi_high(); /* Keep MOSI high during read */ + + for (int i = 7; i >= 0; i--) + { + /* Rising edge - sample MISO */ + flash_sclk_high(); + __NOP(); + __NOP(); + + if (flash_read_miso()) + byte |= (1 << i); + + /* Falling edge */ + flash_sclk_low(); + __NOP(); + } + + return byte; +} + +/** + * @brief Initialize GPIO pins + */ +static void flash_gpio_init(void) +{ + /* CS: Output, HIGH (deselected) */ + nrf_gpio_cfg_output(DR_FLASH_PIN_CS); + nrf_gpio_pin_set(DR_FLASH_PIN_CS); + + /* SCLK: Output, LOW (idle for Mode 0) */ + nrf_gpio_cfg_output(DR_FLASH_PIN_SCLK); + nrf_gpio_pin_clear(DR_FLASH_PIN_SCLK); + + /* MOSI: Output, HIGH */ + nrf_gpio_cfg_output(DR_FLASH_PIN_MOSI); + nrf_gpio_pin_set(DR_FLASH_PIN_MOSI); + + /* MISO: Input, no pull */ + nrf_gpio_cfg_input(DR_FLASH_PIN_MISO, NRF_GPIO_PIN_NOPULL); +} + +/** + * @brief Send Write Enable command (0x06) + */ +static void flash_write_enable(void) +{ + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_WRITE_ENABLE); + flash_cs_high(); + __NOP(); __NOP(); __NOP(); __NOP(); +} + +/*============================================================================== + * PUBLIC FUNCTIONS - INITIALIZATION + *============================================================================*/ + +dr_flash_err_t dr_w25q32_init(void) +{ + DBG_PRINTF("[FLASH] Init\n"); + flash_gpio_init(); + m_initialized = true; + DBG_PRINTF("[FLASH] Init OK\n"); + return DR_FLASH_OK; +} + +void dr_w25q32_uninit(void) +{ + if (!m_initialized) return; + + DBG_PRINTF("[FLASH] Uninit\n"); + + /* CS high (deselect) */ + nrf_gpio_pin_set(DR_FLASH_PIN_CS); + + /* Release pins to default */ + nrf_gpio_cfg_default(DR_FLASH_PIN_CS); + + /* Don't release shared pins (SCLK, MISO, MOSI) - + they may be in use by ADC121S051 */ + + m_initialized = false; +} + +bool dr_w25q32_is_initialized(void) +{ + return m_initialized; +} + +/*============================================================================== + * PUBLIC FUNCTIONS - IDENTIFICATION + *============================================================================*/ + +dr_flash_err_t dr_w25q32_read_jedec_id(dr_flash_jedec_t *jedec) //JEDEC ID 읽기 (0xEF, 0x40, 0x16) +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + if (!jedec) return DR_FLASH_ERR_INVALID_PARAM; + + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_READ_JEDEC_ID); + jedec->manufacturer_id = spi_recv_byte(); + jedec->memory_type = spi_recv_byte(); + jedec->capacity = spi_recv_byte(); + flash_cs_high(); + + DBG_PRINTF("[FLASH] JEDEC ID: 0x%02X 0x%02X 0x%02X\n", + jedec->manufacturer_id, jedec->memory_type, jedec->capacity); + + return DR_FLASH_OK; +} + +dr_flash_err_t dr_w25q32_read_uid(uint8_t *uid) // 8바이트 고유 ID 읽기 +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + if (!uid) return DR_FLASH_ERR_INVALID_PARAM; + + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_READ_UID); + + /* 4 dummy bytes */ + spi_send_byte(0x00); + spi_send_byte(0x00); + spi_send_byte(0x00); + spi_send_byte(0x00); + + /* 8-byte unique ID */ + for (int i = 0; i < DR_FLASH_UID_LENGTH; i++) + { + uid[i] = spi_recv_byte(); + } + flash_cs_high(); + + DBG_PRINTF("[FLASH] UID: %02X%02X%02X%02X%02X%02X%02X%02X\n", + uid[0], uid[1], uid[2], uid[3], uid[4], uid[5], uid[6], uid[7]); + + return DR_FLASH_OK; +} + +/*============================================================================== + * PUBLIC FUNCTIONS - STATUS + *============================================================================*/ + +dr_flash_err_t dr_w25q32_read_status(uint8_t *status) +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + if (!status) return DR_FLASH_ERR_INVALID_PARAM; + + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_READ_STATUS1); + *status = spi_recv_byte(); + flash_cs_high(); + + return DR_FLASH_OK; +} + +bool dr_w25q32_is_busy(void) +{ + uint8_t status = 0; + dr_w25q32_read_status(&status); + return (status & DR_FLASH_SR1_BUSY) ? true : false; +} + +dr_flash_err_t dr_w25q32_wait_busy(uint32_t timeout_ms) +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + + while (timeout_ms > 0) + { + if (!dr_w25q32_is_busy()) + return DR_FLASH_OK; + + nrf_delay_ms(1); + timeout_ms--; + } + + return DR_FLASH_ERR_TIMEOUT; +} + +/*============================================================================== + * PUBLIC FUNCTIONS - READ + *============================================================================*/ + +dr_flash_err_t dr_w25q32_read(uint32_t addr, uint8_t *buf, uint32_t len) // 데이터 읽기 (주소, 길이) +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + if (!buf || len == 0) return DR_FLASH_ERR_INVALID_PARAM; + if (addr + len > DR_FLASH_TOTAL_SIZE) return DR_FLASH_ERR_INVALID_PARAM; + + DBG_PRINTF("[FLASH] Read addr=0x%06X len=%d\n", addr, len); + + flash_cs_low(); + + /* Command + 24-bit address */ + spi_send_byte(DR_FLASH_CMD_READ_DATA); + spi_send_byte((addr >> 16) & 0xFF); + spi_send_byte((addr >> 8) & 0xFF); + spi_send_byte((addr ) & 0xFF); + + /* Read data */ + for (uint32_t i = 0; i < len; i++) + { + buf[i] = spi_recv_byte(); + } + + flash_cs_high(); + + return DR_FLASH_OK; +} + +/*============================================================================== + * PUBLIC FUNCTIONS - WRITE + *============================================================================*/ + +dr_flash_err_t dr_w25q32_write(uint32_t addr, const uint8_t *data, uint32_t len) // 페이지 쓰기 (최대 256B) +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + if (!data || len == 0 || len > DR_FLASH_PAGE_SIZE) + return DR_FLASH_ERR_INVALID_PARAM; + if (addr + len > DR_FLASH_TOTAL_SIZE) + return DR_FLASH_ERR_INVALID_PARAM; + + /* Check page boundary crossing */ + uint32_t page_offset = addr % DR_FLASH_PAGE_SIZE; + if (page_offset + len > DR_FLASH_PAGE_SIZE) + return DR_FLASH_ERR_INVALID_PARAM; + + DBG_PRINTF("[FLASH] Write addr=0x%06X len=%d\n", addr, len); + + /* Write Enable */ + flash_write_enable(); + + /* Page Program */ + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_PAGE_PROGRAM); + spi_send_byte((addr >> 16) & 0xFF); + spi_send_byte((addr >> 8) & 0xFF); + spi_send_byte((addr ) & 0xFF); + + for (uint32_t i = 0; i < len; i++) + { + spi_send_byte(data[i]); + } + + flash_cs_high(); + + /* Wait for programming to complete */ + dr_flash_err_t err = dr_w25q32_wait_busy(BUSY_TIMEOUT_PAGE_PROGRAM); + if (err != DR_FLASH_OK) + DBG_PRINTF("[FLASH] Write TIMEOUT!\n"); + return err; +} + +/*============================================================================== + * PUBLIC FUNCTIONS - ERASE + *============================================================================*/ + +dr_flash_err_t dr_w25q32_erase_sector(uint32_t addr) // 4KB 섹터 삭제 +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + if (addr >= DR_FLASH_TOTAL_SIZE) return DR_FLASH_ERR_INVALID_PARAM; + + DBG_PRINTF("[FLASH] Erase sector addr=0x%06X\n", addr); + + flash_write_enable(); + + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_SECTOR_ERASE); + spi_send_byte((addr >> 16) & 0xFF); + spi_send_byte((addr >> 8) & 0xFF); + spi_send_byte((addr ) & 0xFF); + flash_cs_high(); + + dr_flash_err_t err = dr_w25q32_wait_busy(BUSY_TIMEOUT_SECTOR_ERASE); + if (err != DR_FLASH_OK) + DBG_PRINTF("[FLASH] Erase sector TIMEOUT!\n"); + return err; +} + +dr_flash_err_t dr_w25q32_erase_block_32k(uint32_t addr) // 블록 삭제 +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + if (addr >= DR_FLASH_TOTAL_SIZE) return DR_FLASH_ERR_INVALID_PARAM; + + DBG_PRINTF("[FLASH] Erase block 32K addr=0x%06X\n", addr); + + flash_write_enable(); + + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_BLOCK_ERASE_32K); + spi_send_byte((addr >> 16) & 0xFF); + spi_send_byte((addr >> 8) & 0xFF); + spi_send_byte((addr ) & 0xFF); + flash_cs_high(); + + dr_flash_err_t err = dr_w25q32_wait_busy(BUSY_TIMEOUT_BLOCK_ERASE); + if (err != DR_FLASH_OK) + DBG_PRINTF("[FLASH] Erase block 32K TIMEOUT!\n"); + return err; +} + +dr_flash_err_t dr_w25q32_erase_block_64k(uint32_t addr) // 블록 삭제 +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + if (addr >= DR_FLASH_TOTAL_SIZE) return DR_FLASH_ERR_INVALID_PARAM; + + DBG_PRINTF("[FLASH] Erase block 64K addr=0x%06X\n", addr); + + flash_write_enable(); + + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_BLOCK_ERASE_64K); + spi_send_byte((addr >> 16) & 0xFF); + spi_send_byte((addr >> 8) & 0xFF); + spi_send_byte((addr ) & 0xFF); + flash_cs_high(); + + dr_flash_err_t err = dr_w25q32_wait_busy(BUSY_TIMEOUT_BLOCK_ERASE); + if (err != DR_FLASH_OK) + DBG_PRINTF("[FLASH] Erase block 64K TIMEOUT!\n"); + return err; +} + +dr_flash_err_t dr_w25q32_chip_erase(void) // 전체 삭제 +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + + DBG_PRINTF("[FLASH] Chip erase...\n"); + + flash_write_enable(); + + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_CHIP_ERASE); + flash_cs_high(); + + dr_flash_err_t err = dr_w25q32_wait_busy(BUSY_TIMEOUT_CHIP_ERASE); + if (err == DR_FLASH_OK) + DBG_PRINTF("[FLASH] Chip erase OK\n"); + else + DBG_PRINTF("[FLASH] Chip erase TIMEOUT!\n"); + return err; +} + +/*============================================================================== + * PUBLIC FUNCTIONS - POWER MANAGEMENT + *============================================================================*/ + +dr_flash_err_t dr_w25q32_deep_powerdown(void) // 저전력 모드 (~1uA) +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + + DBG_PRINTF("[FLASH] Deep power-down\n"); + + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_POWER_DOWN); + flash_cs_high(); + + /* tDP: CS high to deep power-down = 3us max */ + nrf_delay_us(5); + + return DR_FLASH_OK; +} + +dr_flash_err_t dr_w25q32_wakeup(void) // 저전력 모드 해제(깨우기) +{ + if (!m_initialized) return DR_FLASH_ERR_NOT_INIT; + + DBG_PRINTF("[FLASH] Wakeup\n"); + + flash_cs_low(); + spi_send_byte(DR_FLASH_CMD_RELEASE_PD); + flash_cs_high(); + + /* tRES1: CS high to standby = 3us max */ + nrf_delay_us(5); + + return DR_FLASH_OK; +} + +/*============================================================================== + * PUBLIC FUNCTIONS - DEBUG / TEST + *============================================================================*/ + +bool dr_w25q32_test(void) // JEDEC ID로 통신 테스트 +{ + dr_flash_jedec_t jedec; + + if (dr_w25q32_read_jedec_id(&jedec) != DR_FLASH_OK) + { + DBG_PRINTF("[FLASH] Test FAIL - read error\n"); + return false; + } + + bool pass = (jedec.manufacturer_id == W25Q32_MANUFACTURER_ID && + jedec.memory_type == W25Q32_MEMORY_TYPE && + jedec.capacity == W25Q32_CAPACITY); + + DBG_PRINTF("[FLASH] Test %s\n", pass ? "PASS" : "FAIL"); + return pass; +} diff --git a/pc_firm/dr_w25q32/dr_w25q32.h b/pc_firm/dr_w25q32/dr_w25q32.h new file mode 100644 index 0000000..2ae60a5 --- /dev/null +++ b/pc_firm/dr_w25q32/dr_w25q32.h @@ -0,0 +1,245 @@ +/******************************************************************************* + * @file dr_w25q32.h + * @brief W25Q32 SPI Flash Driver for nRF52840 + * 32Mbit (4MB) Serial NOR Flash Memory + * @date 2026-03-12 + * + * @details Software SPI (bit-bang) driver for W25Q32RVXHJQ. + * Shares SPI bus (SCK/MISO/MOSI) with ADC121S051. + * Only CS pin is unique (P0.24). + * + * Pin connections: + * nRF52840 W25Q32 (U16) + * P0.24 -----> /CS (pin 1) + * P0.15 <----- DO (pin 2, MISO) + * P0.16 -----> DI (pin 5, MOSI) + * P0.14 -----> CLK (pin 6) + * + * @note WP (pin 3) and HOLD (pin 7) are pulled HIGH via 10k resistors. + ******************************************************************************/ + +#ifndef DR_W25Q32_H +#define DR_W25Q32_H + +#include +#include +#include "nrf_gpio.h" + +/*============================================================================== + * PIN CONFIGURATION + *============================================================================*/ +#define DR_FLASH_PIN_CS NRF_GPIO_PIN_MAP(0, 24) /* Chip Select - SPI_CS_FLASH(P0.24) */ +#define DR_FLASH_PIN_SCLK NRF_GPIO_PIN_MAP(0, 14) /* Serial Clock(shared) - SPI_SCK(P0.14) */ +#define DR_FLASH_PIN_MISO NRF_GPIO_PIN_MAP(0, 15) /* DI_(IO0)(shared) - SPI_MOSI(P0.15) */ +#define DR_FLASH_PIN_MOSI NRF_GPIO_PIN_MAP(0, 16) /* DO_(IO1)(shared) - SPI_MISO(P0.16) */ + +/*============================================================================== + * W25Q32 SPECIFICATIONS + *============================================================================*/ +#define DR_FLASH_PAGE_SIZE 256 /**< Page size (bytes) */ +#define DR_FLASH_SECTOR_SIZE 4096 /**< Sector size (bytes, 4KB) */ +#define DR_FLASH_BLOCK_32K (32*1024) /**< 32KB block */ +#define DR_FLASH_BLOCK_64K (64*1024) /**< 64KB block */ +#define DR_FLASH_TOTAL_SIZE (4*1024*1024) /**< 4MB total */ +#define DR_FLASH_UID_LENGTH 8 /**< Unique ID length (bytes) */ + +/*============================================================================== + * W25Q32 COMMAND OPCODES + *============================================================================*/ +#define DR_FLASH_CMD_WRITE_ENABLE 0x06 +#define DR_FLASH_CMD_WRITE_DISABLE 0x04 +#define DR_FLASH_CMD_READ_STATUS1 0x05 +#define DR_FLASH_CMD_READ_STATUS2 0x35 +#define DR_FLASH_CMD_WRITE_STATUS 0x01 +#define DR_FLASH_CMD_READ_DATA 0x03 +#define DR_FLASH_CMD_PAGE_PROGRAM 0x02 +#define DR_FLASH_CMD_SECTOR_ERASE 0x20 /**< 4KB erase */ +#define DR_FLASH_CMD_BLOCK_ERASE_32K 0x52 /**< 32KB erase */ +#define DR_FLASH_CMD_BLOCK_ERASE_64K 0xD8 /**< 64KB erase */ +#define DR_FLASH_CMD_CHIP_ERASE 0xC7 /**< Full chip erase */ +#define DR_FLASH_CMD_POWER_DOWN 0xB9 /**< Deep power-down */ +#define DR_FLASH_CMD_RELEASE_PD 0xAB /**< Release from deep power-down */ +#define DR_FLASH_CMD_READ_UID 0x4B /**< Read unique ID */ +#define DR_FLASH_CMD_READ_JEDEC_ID 0x9F /**< Read JEDEC ID */ +#define DR_FLASH_CMD_READ_MFR_ID 0x90 /**< Read manufacturer/device ID */ + +/* Status Register 1 bits */ +#define DR_FLASH_SR1_BUSY 0x01 /**< Erase/Write in progress */ +#define DR_FLASH_SR1_WEL 0x02 /**< Write enable latch */ + +/*============================================================================== + * ERROR CODES + *============================================================================*/ +typedef enum { + DR_FLASH_OK = 0, + DR_FLASH_ERR_NOT_INIT, + DR_FLASH_ERR_INVALID_PARAM, + DR_FLASH_ERR_TIMEOUT, + DR_FLASH_ERR_WRITE_FAILED, + DR_FLASH_ERR_JEDEC_MISMATCH +} dr_flash_err_t; + +/*============================================================================== + * DATA STRUCTURES + *============================================================================*/ + +/** @brief JEDEC ID structure */ +typedef struct { + uint8_t manufacturer_id; /**< 0xEF = Winbond */ + uint8_t memory_type; /**< 0x40 = SPI */ + uint8_t capacity; /**< 0x16 = 32Mbit */ +} dr_flash_jedec_t; + +/*============================================================================== + * INITIALIZATION + *============================================================================*/ + +/** + * @brief Initialize W25Q32 Flash driver + * @return dr_flash_err_t Error code + * @note Sets up GPIO pins. Does NOT wake chip from deep power-down. + */ +dr_flash_err_t dr_w25q32_init(void); + +/** + * @brief Uninitialize driver, release GPIO pins + */ +void dr_w25q32_uninit(void); + +/** + * @brief Check if driver is initialized + */ +bool dr_w25q32_is_initialized(void); + +/*============================================================================== + * IDENTIFICATION + *============================================================================*/ + +/** + * @brief Read JEDEC ID (manufacturer, type, capacity) + * @param jedec Pointer to JEDEC ID structure + * @return dr_flash_err_t Error code + * @note Expected: manufacturer=0xEF, type=0x40, capacity=0x16 + */ +dr_flash_err_t dr_w25q32_read_jedec_id(dr_flash_jedec_t *jedec); + +/** + * @brief Read 8-byte unique ID + * @param uid Buffer to store 8-byte UID (must be >= 8 bytes) + * @return dr_flash_err_t Error code + */ +dr_flash_err_t dr_w25q32_read_uid(uint8_t *uid); + +/*============================================================================== + * READ + *============================================================================*/ + +/** + * @brief Read data from flash + * @param addr 24-bit start address (0x000000 ~ 0x3FFFFF) + * @param buf Buffer to store read data + * @param len Number of bytes to read + * @return dr_flash_err_t Error code + */ +dr_flash_err_t dr_w25q32_read(uint32_t addr, uint8_t *buf, uint32_t len); + +/*============================================================================== + * WRITE + *============================================================================*/ + +/** + * @brief Write data to flash (page program, max 256 bytes) + * @param addr 24-bit start address (must be page-aligned for best results) + * @param data Data to write + * @param len Number of bytes (1~256, must not cross page boundary) + * @return dr_flash_err_t Error code + * @note Automatically sends Write Enable before programming. + * Waits for completion (BUSY flag). + */ +dr_flash_err_t dr_w25q32_write(uint32_t addr, const uint8_t *data, uint32_t len); + +/*============================================================================== + * ERASE + *============================================================================*/ + +/** + * @brief Erase 4KB sector + * @param addr Any address within the sector to erase + * @return dr_flash_err_t Error code + * @note Typical 45ms, max 400ms. Waits for completion. + */ +dr_flash_err_t dr_w25q32_erase_sector(uint32_t addr); + +/** + * @brief Erase 32KB block + * @param addr Any address within the block + * @return dr_flash_err_t Error code + */ +dr_flash_err_t dr_w25q32_erase_block_32k(uint32_t addr); + +/** + * @brief Erase 64KB block + * @param addr Any address within the block + * @return dr_flash_err_t Error code + */ +dr_flash_err_t dr_w25q32_erase_block_64k(uint32_t addr); + +/** + * @brief Erase entire chip + * @return dr_flash_err_t Error code + * @note Takes 6~50 seconds. Use with caution. + */ +dr_flash_err_t dr_w25q32_chip_erase(void); + +/*============================================================================== + * POWER MANAGEMENT + *============================================================================*/ + +/** + * @brief Enter deep power-down mode (~1uA) + * @return dr_flash_err_t Error code + */ +dr_flash_err_t dr_w25q32_deep_powerdown(void); + +/** + * @brief Release from deep power-down + * @return dr_flash_err_t Error code + * @note Requires ~3us recovery time (handled internally) + */ +dr_flash_err_t dr_w25q32_wakeup(void); + +/*============================================================================== + * STATUS + *============================================================================*/ + +/** + * @brief Read Status Register 1 + * @param status Pointer to store status byte + * @return dr_flash_err_t Error code + */ +dr_flash_err_t dr_w25q32_read_status(uint8_t *status); + +/** + * @brief Check if flash is busy (erase/write in progress) + * @return true if busy + */ +bool dr_w25q32_is_busy(void); + +/** + * @brief Wait until flash is not busy + * @param timeout_ms Maximum wait time in milliseconds + * @return dr_flash_err_t DR_FLASH_OK or DR_FLASH_ERR_TIMEOUT + */ +dr_flash_err_t dr_w25q32_wait_busy(uint32_t timeout_ms); + +/*============================================================================== + * DEBUG / TEST + *============================================================================*/ + +/** + * @brief Test flash communication by reading JEDEC ID + * @return true if JEDEC ID matches W25Q32 (0xEF, 0x40, 0x16) + */ +bool dr_w25q32_test(void); + +#endif /* DR_W25Q32_H */ diff --git a/pc_firm/parser.c b/pc_firm/parser.c index 42f1e7b..c87bebf 100644 --- a/pc_firm/parser.c +++ b/pc_firm/parser.c @@ -39,7 +39,7 @@ extern void param_error(const char *cmd); /* BLE transmission */ extern void single_format_data(uint8_t *buffer, const char *tag, uint16_t value); extern void ascii_format_data(uint8_t *buffer, const char *tag, const char *ascii, uint8_t len); -extern void binary_tx_handler(const uint8_t *buffer, uint16_t length); +extern void dr_binary_tx_safe(const uint8_t *buffer, uint16_t length); extern void dr_sd_delay_ms(uint32_t ms); /* Softdevice-friendly delay */ /* FDS config (fstorage) */ @@ -83,7 +83,8 @@ extern bool go_device_power_off; extern bool go_NVIC_SystemReset; extern bool bond_data_delete; extern uint8_t m_reset_status; -extern ret_code_t eeprom_write_byte(uint16_t mem_address, uint8_t data); +extern void config_save(void); +extern config_data_t m_config; /* AGC_GAIN_SW is a macro in measurements.h - replicate here */ #include "nrf_gpio.h" @@ -302,7 +303,7 @@ static int Cmd_mfv(const ParsedCmd *cmd); static int Cmd_msp(const ParsedCmd *cmd); /* IMU 6-axis raw data (single shot) */ static int Cmd_mpa(const ParsedCmd *cmd); /* Piezo TX/RX Activate */ -static int Cmd_mpb(const ParsedCmd *cmd); /* Piezo TX/RX Deactivate 26.03.13 */ +static int Cmd_mpb(const ParsedCmd *cmd); /* Piezo TX/RX Deactivate */ static int Cmd_mpc(const ParsedCmd *cmd); /* Piezo Burst Capture */ static int Cmd_mdc(const ParsedCmd *cmd); /* Piezo ADC Capture */ static int Cmd_mec(const ParsedCmd *cmd); /* Piezo Burst + ADC capture */ @@ -427,7 +428,7 @@ int dr_cmd_parser(const uint8_t *buf, uint8_t len) /* CRC 실패 시 에러 응답 전송 */ if (g_plat.crc_check && g_plat.tx_bin) { single_format_data(ble_bin_buffer, "crc!", 65530); - binary_tx_handler(ble_bin_buffer, 3); + dr_binary_tx_safe(ble_bin_buffer, 3); } return -1; /* CRC 실패 또는 파싱 실패 → 음수로 old parser에 위임 */ } @@ -474,7 +475,7 @@ static int Cmd_mta(const ParsedCmd *cmd) if (g_plat.tx_bin) { single_format_data(ble_bin_buffer, "rta:", mode); - binary_tx_handler(ble_bin_buffer, 3); + dr_binary_tx_safe(ble_bin_buffer, 3); } return 1; @@ -515,7 +516,7 @@ static int Cmd_sta(const ParsedCmd *cmd) if (g_plat.tx_bin) { single_format_data(ble_bin_buffer, "sta:", mode); - binary_tx_handler(ble_bin_buffer, 3); + dr_binary_tx_safe(ble_bin_buffer, 3); } return 1; @@ -683,7 +684,7 @@ static int Cmd_ssq(const ParsedCmd *cmd) g_plat.log("[Cmd_ssq] Power off\r\n"); } single_format_data(ble_bin_buffer, "rsq:", val); - binary_tx_handler(ble_bin_buffer, 2); + dr_binary_tx_safe(ble_bin_buffer, 2); go_device_power_off = true; main_timer_start(); return 1; @@ -698,11 +699,12 @@ static int Cmd_ssr(const ParsedCmd *cmd) g_plat.log("[Cmd_ssr] Bond delete + reset\r\n"); } single_format_data(ble_bin_buffer, "rsr:", val); - binary_tx_handler(ble_bin_buffer, 2); + dr_binary_tx_safe(ble_bin_buffer, 2); bond_data_delete = true; - eeprom_write_byte(0x0060, (uint8_t)bond_data_delete); + m_config.bond_data_delete = (uint8_t)bond_data_delete; m_reset_status = 2; - eeprom_write_byte(0x0065, m_reset_status); + m_config.reset_status = m_reset_status; + config_save(); nrf_delay_ms(5); go_NVIC_SystemReset = true; main_timer_start(); @@ -718,9 +720,10 @@ static int Cmd_sss(const ParsedCmd *cmd) g_plat.log("[Cmd_sss] Device reset\r\n"); } single_format_data(ble_bin_buffer, "rss:", val); - binary_tx_handler(ble_bin_buffer, 2); + dr_binary_tx_safe(ble_bin_buffer, 2); m_reset_status = 2; - eeprom_write_byte(0x0065, m_reset_status); + m_config.reset_status = m_reset_status; + config_save(); nrf_delay_ms(5); go_NVIC_SystemReset = true; main_timer_start(); @@ -736,7 +739,7 @@ static int Cmd_sst(const ParsedCmd *cmd) g_plat.log("[Cmd_sst] Ready\r\n"); } single_format_data(ble_bin_buffer, "rst:", val); - binary_tx_handler(ble_bin_buffer, 2); + dr_binary_tx_safe(ble_bin_buffer, 2); return 1; } @@ -747,7 +750,7 @@ static int Cmd_mfv(const ParsedCmd *cmd) g_plat.log("[Cmd_mfv] FW=%s\r\n", DR_DEVICE_VERSION); } ascii_format_data(ble_bin_buffer, "rfv:", DR_DEVICE_VERSION, 12); - binary_tx_handler(ble_bin_buffer, 8); + dr_binary_tx_safe(ble_bin_buffer, 8); return 1; } @@ -764,7 +767,7 @@ static int Cmd_mpa(const ParsedCmd *cmd) if (g_plat.tx_bin) { single_format_data(ble_bin_buffer, "rpa:", 1); - binary_tx_handler(ble_bin_buffer, 3); + dr_binary_tx_safe(ble_bin_buffer, 3); } return 1; @@ -783,7 +786,7 @@ static int Cmd_mpb(const ParsedCmd *cmd) if (g_plat.tx_bin) { single_format_data(ble_bin_buffer, "rpb:", 1); - binary_tx_handler(ble_bin_buffer, 3); + dr_binary_tx_safe(ble_bin_buffer, 3); } return 1; @@ -856,9 +859,9 @@ static int Cmd_mpc(const ParsedCmd *cmd) case 4: dr_piezo_burst_sw_22mhz((uint8_t)cycles); break; - case 9: + /*case 9: dr_piezo_burst_sw_19mhz((uint8_t)cycles); - break; + break;*/ case 1: default: dr_piezo_burst_sw((uint8_t)cycles); /* 2.1MHz */ @@ -982,7 +985,7 @@ static int Cmd_mdc(const ParsedCmd *cmd) ble_bin_buffer[11] = (uint8_t)(echo.baseline_raw >> 8); ble_bin_buffer[12] = (uint8_t)(echo.num_samples & 0xFF); ble_bin_buffer[13] = (uint8_t)(echo.num_samples >> 8); - binary_tx_handler(ble_bin_buffer, 7); /* 14 bytes = 7 words */ + dr_binary_tx_safe(ble_bin_buffer, 7); /* 14 bytes = 7 words */ nrf_delay_ms(100); /* Wait for BLE stack */ /* Packet 2~N: rdd: data packets with packed 12-bit samples */ @@ -1009,7 +1012,7 @@ static int Cmd_mdc(const ParsedCmd *cmd) /* Ensure even byte count for word alignment */ if (dst_idx & 1) ble_bin_buffer[dst_idx++] = 0; - binary_tx_handler(ble_bin_buffer, dst_idx / 2); /* bytes to words */ + dr_binary_tx_safe(ble_bin_buffer, dst_idx / 2); /* bytes to words */ nrf_delay_ms(100); /* Inter-packet delay */ } @@ -1020,7 +1023,7 @@ static int Cmd_mdc(const ParsedCmd *cmd) ble_bin_buffer[3] = ':'; ble_bin_buffer[4] = (uint8_t)(total_packets & 0xFF); ble_bin_buffer[5] = (uint8_t)(total_packets >> 8); - binary_tx_handler(ble_bin_buffer, 3); /* 6 bytes = 3 words */ + dr_binary_tx_safe(ble_bin_buffer, 3); /* 6 bytes = 3 words */ if (g_plat.log && g_log_enable) { g_plat.log("[Cmd_mdc] sent rdb+rdd*%u+rde (%u samples)\r\n", @@ -1295,7 +1298,7 @@ static int Cmd_mwh(const ParsedCmd *cmd) } ascii_format_data(ble_bin_buffer, "rwh:", buf, 12); - binary_tx_handler(ble_bin_buffer, 8); + dr_binary_tx_safe(ble_bin_buffer, 8); return 1; } @@ -1321,7 +1324,7 @@ static int Cmd_mws(const ParsedCmd *cmd) } ascii_format_data(ble_bin_buffer, "rws:", buf, 12); - binary_tx_handler(ble_bin_buffer, 8); + dr_binary_tx_safe(ble_bin_buffer, 8); return 1; } @@ -1331,7 +1334,7 @@ static int Cmd_mrh(const ParsedCmd *cmd) (void)cmd; memcpy(HW_NO, m_config.hw_no, 12); ascii_format_data(ble_bin_buffer, "rrh:", HW_NO, 12); - binary_tx_handler(ble_bin_buffer, 8); + dr_binary_tx_safe(ble_bin_buffer, 8); return 1; } @@ -1341,7 +1344,7 @@ static int Cmd_mrs(const ParsedCmd *cmd) (void)cmd; memcpy(SERIAL_NO, m_config.serial_no, 12); ascii_format_data(ble_bin_buffer, "rrs:", SERIAL_NO, 12); - binary_tx_handler(ble_bin_buffer, 8); + dr_binary_tx_safe(ble_bin_buffer, 8); return 1; } diff --git a/project/ble_peripheral/ble_app_bladder_patch/LED_Parse.c b/project/ble_peripheral/ble_app_bladder_patch/LED_Parse.c deleted file mode 100644 index be44e22..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/LED_Parse.c +++ /dev/null @@ -1,158 +0,0 @@ -#include "sdk_common.h" - -#include -#include -#include -#include -#include "nrf.h" -#include "nrf_drv_gpiote.h" -#include "nrf_drv_spi.h" -#include "nrf_drv_saadc.h" -#include "nrf_drv_ppi.h" -#include "nrf_drv_timer.h" -#include "boards.h" -#include "nrf_log.h" - -#include "LED_Parse.h" -#include "app_timer.h" -#include "measurements.h" -#include "main.h" -//#include "fstorage.h" -#include "mcp4725_i2c.h" //VGA -#include "ir_i2c.h" //IR -#include "debug_print.h" -//#define LED_S1 0x50 //VGA LED1~5 -//#define LED_S2 0x50 -//#define LED_S3 0x51 -//#define LED_S4 0x52 -//#define LED_S5 0x53 -//#define LED_S6 0x51 //VGA -//#define LED_S7 0x54 -//#define LED_S8 0x55 -//#define LED_S9 0x56 -//#define LED_S10 0x57 //LED 46~50 - -#define LED_S0 0x50 -#define LED_S1 0x51 -#define LED_S2 0x52 -#define LED_S3 0x53 -#define LED_S4 0x54 -#define LED_S5 0x55 -#define LED_S6 0x56 -#define LED_S7 0x57 - - -uint8_t LED_READ_ROM(uint8_t led_index) -{ - // uint32_t err_code = NRF_SUCCESS; - uint8_t addr=0xf0; - uint8_t r_index; - r_index = (led_index)%6; - uint8_t r_data[10]; - uint8_t r_value=0; - - - switch(led_index) { - - - - case 0: case 1: case 2: case 3: case 4: case 5: - r_value = ir_command_read(LED_S0, addr + r_index, r_data); - break; - - case 6: case 7: case 8: case 9: case 10: case 11: - r_value = ir_command_read(LED_S1, addr + r_index, r_data); - break; - - case 12: case 13: case 14: case 15: case 16: case 17: - r_value = ir_command_read(LED_S2, addr + r_index, r_data); - break; - - case 18: case 19: case 20: case 21: case 22: case 23: - r_value = ir_command_read(LED_S3, addr + r_index, r_data); - break; - - case 24: case 25: case 26: case 27: case 28: case 29: - r_value = ir_command_read(LED_S4, addr + r_index, r_data); - break; - - case 30: case 31: case 32: case 33: case 34: case 35: - r_value = ir_command_read(LED_S5, addr + r_index, r_data); - break; - - case 36: case 37: case 38: case 39: case 40: case 41: - r_value = ir_command_read(LED_S6, addr + r_index, r_data); - break; - - case 42: case 43: case 44: case 45: case 46: case 47: - r_value = ir_command_read(LED_S7, addr + r_index, r_data); - break; - default: - DBG_PRINTF("Invalid LED index\r\n"); - // err_code = NRF_ERROR_NOT_FOUND; - break; - - - } - - return r_value; -} - - - - -ret_code_t LED_WRITE_ROM(uint8_t led_index, int16_t led_power) -{ - uint32_t err_code = NRF_SUCCESS; - uint8_t addr=0xf0; - uint8_t r_index; - r_index = (led_index)%6; - - - - switch(led_index) { - - - - case 0: case 1: case 2: case 3: case 4: case 5: - ir_command_write(LED_S0, addr + r_index, led_power); - break; - - case 6: case 7: case 8: case 9: case 10: case 11: - ir_command_write(LED_S1, addr + r_index, led_power); - break; - - case 12: case 13: case 14: case 15: case 16: case 17: - ir_command_write(LED_S2, addr + r_index, led_power); - break; - - case 18: case 19: case 20: case 21: case 22: case 23: - ir_command_write(LED_S3, addr + r_index, led_power); - break; - - case 24: case 25: case 26: case 27: case 28: case 29: - ir_command_write(LED_S4, addr + r_index, led_power); - break; - - case 30: case 31: case 32: case 33: case 34: case 35: - ir_command_write(LED_S5, addr + r_index, led_power); - break; - - case 36: case 37: case 38: case 39: case 40: case 41: - ir_command_write(LED_S6, addr + r_index, led_power); - break; - - case 42: case 43: case 44: case 45: case 46: case 47: - ir_command_write(LED_S7, addr + r_index, led_power); - break; - default: - DBG_PRINTF("Invalid LED index\r\n"); - err_code = NRF_ERROR_NOT_FOUND; - break; - - - } - DBG_PRINTF("write\r\n"); - return err_code; -} - diff --git a/project/ble_peripheral/ble_app_bladder_patch/LED_Parse.h b/project/ble_peripheral/ble_app_bladder_patch/LED_Parse.h deleted file mode 100644 index bde995a..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/LED_Parse.h +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef _LED_Parse_H_ -#define _LED_Parse_H_ - - - - - -#include -#include -#include -#include - -#include "app_timer.h" -#include "measurements.h" -#include "main.h" -//#include "fstorage.h" -#include "mcp4725_i2c.h" //VGA -#include "ir_i2c.h" //IR - - -uint8_t LED_READ_ROM(uint8_t led_index); - -ret_code_t LED_WRITE_ROM(uint8_t led_index, int16_t led_power); - -#endif /* PARSE */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/ad5272_i2c.c b/project/ble_peripheral/ble_app_bladder_patch/ad5272_i2c.c deleted file mode 100644 index 73921eb..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/ad5272_i2c.c +++ /dev/null @@ -1,299 +0,0 @@ -/******************************************************************************* - * @file ad5272_i2c.c - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -/* board driver */ -#include -#include -#include - -#include -#include "nrf.h" -#include "app_error.h" -#include "boards.h" -#include "nrfx_gpiote.h" -#include "nrfx_twi.h" - -#include "nrf_delay.h" -#include "ad5272_i2c.h" -#include "debug_print.h" - -/* I2C number and slave address for AD5272 */ -#define AD5272_I2C_ADDR 0x2F /* Default I2C address if ADDR = GND */ -#define AD5272_MAX_SERIAL_WRITE 16 - -int16_t read_from_ad5272 = 0; -uint16_t data_16_to_write = 0; - - -/* TWI instance. */ -const nrfx_twi_t m_twi_ad5272 = NRFX_TWI_INSTANCE(AD5272_I2C_INSTANCE); - - -void ad5272_i2c_uninit(void){ - nrfx_twi_disable(&m_twi_ad5272); - nrfx_twi_uninit(&m_twi_ad5272); -} - - -void ad5272_i2c_init(void){ - ret_code_t err_code; - - const nrfx_twi_config_t twi_ad5272_config = { - .scl = AD5272_I2C_SCL_PIN, - .sda = AD5272_I2C_SDA_PIN, - .frequency = NRF_TWI_FREQ_400K, - .interrupt_priority = APP_IRQ_PRIORITY_HIGH, - }; - - err_code = nrfx_twi_init(&m_twi_ad5272, &twi_ad5272_config, NULL, NULL); - APP_ERROR_CHECK(err_code); - - nrfx_twi_enable(&m_twi_ad5272); -} - - -ret_code_t ad5272_twi_tx( uint8_t device_id, - uint8_t const * p_data, - uint8_t length, - bool no_stop) -{ - ret_code_t ret; - ret = nrfx_twi_tx(&m_twi_ad5272, device_id, p_data, length, no_stop); - return ret; -} - - -ret_code_t ad5272_twi_rx( uint8_t device_id, - uint8_t * p_data, - uint8_t length) -{ - ret_code_t ret; - ret = nrfx_twi_rx(&m_twi_ad5272, device_id, p_data, length); - return ret; -} - - -int16_t ad5272_command_read(uint8_t command, uint8_t write_data) -{ - uint8_t error_count = 0; - uint8_t data_buff[1+AD5272_MAX_SERIAL_WRITE]; - uint16_t data_to_write = 0; - int16_t read_data = 0; - ret_code_t ret; - - if (AD5272_50TP_WIPER_READ == command) - { - // shift the command over into bits 13:10 - data_to_write = command<<10; - // also need to send 6-bit 50-TP location - data_to_write |= write_data; - } - else if ( (AD5272_RDAC_READ == command) || (AD5272_50TP_LAST_USED == command) || (AD5272_CONTROL_READ == command) ) - { - // command is in range and something possible to read - // shift the command over into bits 13:10 - data_to_write = command<<10; - } - else - { - // It's either a bad command (out of range, > AD5272_SHUTDOWN), or its not a readable command - // Bad command, we can't reasonably proceed - error_count = 100; - } - - /** - * At this point, if error_count == 0 we have a valid read command - */ - if (0 == error_count) - { - memset(data_buff, 0, 1+AD5272_MAX_SERIAL_WRITE); - data_buff[0] = (data_to_write >> 8); // ms byte to write - data_buff[1] = data_to_write & 0x0FF; // ls byte to write - -#if FEATURE_PRINTF - DBG_PRINTF("ad5272_rx_1_buff[0]=0x%x, [1]=0x%x\r\n", data_buff[0], data_buff[1]); -#endif - ret = ad5272_twi_tx(AD5272_I2C_ADDR, data_buff, 2, true); - if(ret != NRF_SUCCESS) { - ret = ad5272_twi_tx(AD5272_I2C_ADDR, data_buff, 2, true); - if(ret != NRF_SUCCESS) { -#if FEATURE_PRINTF - DBG_PRINTF("ad5272_ERR! i2c read-1\r\n"); -#endif - //APP_ERROR_CHECK(ret); - } - } - - - memset(data_buff, 0, 1+AD5272_MAX_SERIAL_WRITE); - - ret = ad5272_twi_rx(AD5272_I2C_ADDR, data_buff, 2); - if(ret != NRF_SUCCESS) { - ret = ad5272_twi_rx(AD5272_I2C_ADDR, data_buff, 2); - if(ret != NRF_SUCCESS) { -#if FEATURE_PRINTF - DBG_PRINTF("ad5272_ERR! i2c read-2\r\n"); -#endif - //APP_ERROR_CHECK(ret); - } - } - read_data = data_buff[0] << 8; // ms byte - read_data |= data_buff[1]; // ls byte - - -#if FEATURE_PRINTF - DBG_PRINTF("ad5272_read_data = 0x%x\r\n",read_data); -#endif - }else{ -#if FEATURE_PRINTF - DBG_PRINTF("ad5272_read_data USELESS!!!\r\n"); -#endif - } - - return read_data; -} - - -int8_t ad5272_command_write(uint8_t command, uint16_t write_data) -{ - uint8_t error_count = 0; - uint8_t data_buff[1+AD5272_MAX_SERIAL_WRITE]; - ret_code_t ret; - - int8_t return_val = 0; - uint16_t data_to_write = 0; - - if (write_data > 0x3FF) - { - // data in bits 13:10 will clobber the command when we OR in write_datum16 - write_data &= 0x3FF; // clip off any bad high bits even though we are going to error out and not use them -#if FEATURE_PRINTF - DBG_PRINTF("ad5272_ERR! Input Value wrong!\r\n"); -#endif - } - - if ( (AD5272_RDAC_WRITE == command) || (AD5272_CONTROL_WRITE == command) || (AD5272_SHUTDOWN == command) ) - { - // these commands need to use data we send over - // shift the command over into bits 13:10 - data_to_write = command<<10; - // also need to send 10-bit or 8-bit wiper value, or 3 control bits, or shutdown bit - data_to_write |= write_data; - } - else if ( (AD5272_50TP_WRITE == command) || (AD5272_RDAC_REFRESH == command) ) - { - // shift the command over into bits 13:10 - data_to_write = command<<10; - // no data needed - } - else - { - // It's either a bad command (out of range, > AD5272_SHUTDOWN), or its not a writeable command - // Bad command, we can't reasonably proceed - error_count = 100; - } - - // if no errors so far, command is valid and datum is too - if (0 == error_count) - { - data_buff[0] = (data_to_write >> 8); // ms byte to write - data_buff[1] = data_to_write & 0x0FF; // ls byte to write - ret = ad5272_twi_tx(AD5272_I2C_ADDR, data_buff, 2, false); - if(ret != NRF_SUCCESS) { - ret = ad5272_twi_tx(AD5272_I2C_ADDR, data_buff, 2, false); - if(ret != NRF_SUCCESS) { -#if FEATURE_PRINTF - DBG_PRINTF("ad5272_ERR! i2c write\r\n"); -#endif - //APP_ERROR_CHECK(ret); - return_val = NRF_ERROR_INTERNAL; - } - } - } - - return return_val; -} - - -void ad5272_i2c_is_busy(void) -{ - uint8_t buffer[3]; /* Addr + data */ - - buffer[0] = AD5272_COMMAND_NOP; - buffer[1] = 0x00; - - while(NRF_SUCCESS != ad5272_twi_tx(AD5272_I2C_ADDR, buffer, 1, false)) - { -#if FEATURE_PRINTF - DBG_PRINTF("ad5272_BUSY : is Busy\r\n"); -#endif - } -} - - -/** - * - */ -int8_t ad5272_write_and_read_rdac (uint16_t data_16_to_write) -{ - ret_code_t ret; - - ret = ad5272_command_write(AD5272_CONTROL_WRITE, AD5272_RDAC_WIPER_WRITE_ENABLE); /* Write Enable */ - ret |= ad5272_command_write(AD5272_RDAC_WRITE, data_16_to_write); /* Write Data */ - ret |= ad5272_command_write(AD5272_CONTROL_WRITE, 0x00); /* Write Disable & Use 50tp value */ - - read_from_ad5272 = ad5272_command_read(AD5272_RDAC_READ, 0x00); - - return ret; -} - - -int16_t ad5272_read_rdac (void) -{ - read_from_ad5272 = ad5272_command_read(AD5272_RDAC_READ, 0x00); - - return read_from_ad5272; -} - - -int8_t ad5272_write_rdac (uint16_t data_16_to_write) -{ - ret_code_t ret; - - ret = ad5272_command_write(AD5272_CONTROL_WRITE, AD5272_RDAC_WIPER_WRITE_ENABLE); /* Write Enable */ - ret |= ad5272_command_write(AD5272_RDAC_WRITE, data_16_to_write); /* Write Data */ - ret |= ad5272_command_write(AD5272_CONTROL_WRITE, 0x00); /* Write Disable & Use 50tp value */ - - return ret; -} - - -void ad5272_RDAC_refresh(void) -{ - ad5272_command_write(AD5272_RDAC_REFRESH, 0x00); - - ad5272_i2c_is_busy(); -} - - -void ad5272_shutdown_mode(void) -{ - ad5272_command_write(AD5272_SHUTDOWN, 0x01); - - ad5272_i2c_is_busy(); -} - - -void ad5272_normal_mode(void) -{ - ad5272_command_write(AD5272_SHUTDOWN, 0x00); - - ad5272_i2c_is_busy(); -} - - diff --git a/project/ble_peripheral/ble_app_bladder_patch/ad5272_i2c.h b/project/ble_peripheral/ble_app_bladder_patch/ad5272_i2c.h deleted file mode 100644 index 48a938f..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/ad5272_i2c.h +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************************* - * @file ad5272_i2c.h - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#ifndef _ADA5272_I2C_H_ -#define _ADA5272_I2C_H_ - -#include "sdk_common.h" - -#include -#include "nrf.h" -#include "nrf_drv_gpiote.h" - - -#define AD5272_I2C_INSTANCE 1 /**< I2C instance index. */ -#define AD5272_I2C_SDA_PIN NRF_GPIO_PIN_MAP(0,10) -#define AD5272_I2C_SCL_PIN NRF_GPIO_PIN_MAP(0,9) - -/** - * COMMAND CONSTANTS - * Commands are 16-bit writes: bits 15:14 are 0s - * Bits 13:10 are the command value below - * Bits 9:0 are data for the command, but not all bits are used with all commands - */ - -// The NOP command is included for completeness. It is a valid I2C operation. -#define AD5272_COMMAND_NOP 0x00 // Do nothing. Why you would want to do this I don't know - -// write the 10 or 8 data bits to the RDAC wiper register (it must be unlocked first) -#define AD5272_RDAC_WRITE 0x01 - -#define AD5272_RDAC_READ 0x02 // read the RDAC wiper register - -#define AD5272_50TP_WRITE 0x03 // store RDAC setting to 50-TP - -// SW reset: refresh RDAC with last 50-TP stored value -// If not 50-TP value, reset to 50% I think??? -// data bits are all dont cares -#define AD5272_RDAC_REFRESH 0x04 // TODO refactor this to AD5272_SOFT_RESET - -// read contents of 50-TP in next frame, at location in data bits 5:0, -// see Table 16 page 22 Rev D datasheet -// location 0x0 is reserved, 0x01 is first programmed wiper location, 0x32 is 50th programmed wiper location -#define AD5272_50TP_WIPER_READ 0x05 - -/** - * Read contents of last-programmed 50-TP location - * This is the location used in SW Reset command 4 or on POR - */ -#define AD5272_50TP_LAST_USED 0x06 - -#define AD5272_CONTROL_WRITE 0x07 // data bits 2:0 are the control bits - -#define AD5272_CONTROL_READ 0x08 // data bits all dont cares - -#define AD5272_SHUTDOWN 0x09 // data bit 0 set = shutdown, cleared = normal mode - - -/** - * Control bits are three bits written with command 7 - */ -// enable writing to the 50-TP memory by setting this control bit C0 -// default is cleared so 50-TP writing is disabled -// only 50 total writes are possible! -#define AD5272_50TP_WRITE_ENABLE 0x01 - -// enable writing to volatile RADC wiper by setting this control bit C1 -// otherwise it is frozen to the value in the 50-TP memory -// default is cleared, can't write to the wiper -#define AD5272_RDAC_WIPER_WRITE_ENABLE 0x02 - -// enable high precision calibration by clearing this control bit C2 -// set this bit to disable high accuracy mode (dunno why you would want to) -// default is 0 = emabled -#define AD5272_RDAC_CALIB_DISABLE 0x04 - -// 50TP memory has been successfully programmed if this bit is set -#define AD5272_50TP_WRITE_SUCCESS 0x08 - -#define AD5272_NORMAL_MODE 0x01 -#define AD5272_SHUTDOWN_MODE 0x01 - -void ad5272_i2c_uninit(void); -void ad5272_i2c_init(void); -int16_t ad5272_command_read(uint8_t command, uint8_t write_data); -int8_t ad5272_command_write(uint8_t command, uint16_t write_data); -void ad5272_i2c_is_busy(void); -int8_t ad5272_write_and_read_rdac (uint16_t data_16_to_write); -int16_t ad5272_read_rdac (void); -int8_t ad5272_write_rdac (uint16_t data_16_to_write); - -void read_all_50tp (void); -void ad5272_RDAC_refresh(void); -void ad5272_shutdown_mode(void); -void ad5272_normal_mode(void); - -#endif /* !_ADA5272_I2C_H_ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/ada2200_spi.c b/project/ble_peripheral/ble_app_bladder_patch/ada2200_spi.c deleted file mode 100644 index 808cdda..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/ada2200_spi.c +++ /dev/null @@ -1,112 +0,0 @@ -/******************************************************************************* - * @file ada2200_spi.c - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#include "sdk_common.h" - -#include -#include "nrf.h" -#include "nrf_drv_gpiote.h" -#include "app_error.h" -#include "boards.h" -#include "nrf_drv_spi.h" -#include "nrf_delay.h" - -#include "nrf_log.h" -#include "ada2200_spi.h" - - -static const nrf_drv_spi_t spi_ada2200 = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE); /**< SPI instance. */ - -//static uint8_t ada2200_startR[] ={ 0x00, 0x00, 0x81 }; /* {addr 16bit, data}, Reset for Defaults */ - -static uint8_t ada2200_start0[] ={ 0x00, 0x00, 0x18 }; /* {addr 16bit, data}, Set SDIO input only, Activate SDO */ -static uint8_t ada2200_start1[] ={ 0x00, 0x2B, 0x06 }; /* {addr 16bit, data}, Clock Configuration */ -static uint8_t ada2200_start2[] ={ 0x00, 0x2A, 0x18 }; /* {addr 16bit, data}, Enable Mixer, Select SDO output for Pin 13, OFF RCLK. */ -static uint8_t ada2200_start3[] ={ 0x00, 0x29, 0x23 }; /* 0x27 {addr 16bit, data}, Disable SYNCO output, Select SYNCO edge location (Sync timing adjustment) */ -static uint8_t ada2200_start4[] ={ 0x00, 0x2C, 0x01 }; /* {addr 16bit, data}, Enable RCLK output */ - -static uint8_t ada2200_stop0[] ={ 0x00, 0x00, 0x18 }; /* {addr 16bit, data}, Set SDIO input only, Activate SDO */ -static uint8_t ada2200_stop1[] ={ 0x00, 0x2B, 0x06 }; /* {addr 16bit, data}, Clock Configuration */ -static uint8_t ada2200_stop2[] ={ 0x00, 0x2A, 0x10 }; /* {addr 16bit, data}, Enable Mixer, Select SDO output for Pin 13, OFF RCLK. */ -static uint8_t ada2200_stop3[] ={ 0x00, 0x29, 0x01 }; /* 0x07 {addr 16bit, data}, Disable SYNCO output, Select SYNCO edge location (Sync timing adjustment) */ -static uint8_t ada2200_stop4[] ={ 0x00, 0x2C, 0x00 }; /* {addr 16bit, data}, Enable RCLK output */ - -static uint8_t m_tx_buf[3]; /**< TX buffer. */ -static uint8_t m_length = sizeof(m_tx_buf); /**< Transfer length. */ - - -void ada2200_spi_write(const void * data, size_t size) -{ - memcpy(m_tx_buf, data, size); - APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi_ada2200, m_tx_buf, size, NULL, 0)); -} - - -extern void ada2200_start(void) -{ - //ada2200_spi_write(ada2200_startR, m_length); - - ada2200_spi_write(ada2200_start0, m_length); - nrf_delay_us(2); - ada2200_spi_write(ada2200_start1, m_length); - nrf_delay_us(2); - ada2200_spi_write(ada2200_start2, m_length); - nrf_delay_us(2); - ada2200_spi_write(ada2200_start3, m_length); - nrf_delay_us(2); - ada2200_spi_write(ada2200_start4, m_length); - nrf_delay_us(2); -} - - -extern void ada2200_stop(void) -{ - ada2200_spi_write(ada2200_stop0, m_length); - nrf_delay_us(2); - ada2200_spi_write(ada2200_stop1, m_length); - nrf_delay_us(2); - ada2200_spi_write(ada2200_stop2, m_length); - nrf_delay_us(2); - ada2200_spi_write(ada2200_stop3, m_length); - nrf_delay_us(2); - ada2200_spi_write(ada2200_stop4, m_length); - nrf_delay_us(2); -} - - -extern void ada2200_init(void) -{ - nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG; - spi_config.ss_pin = SPI_CS_PIN; - spi_config.miso_pin = SPI_MISO_PIN; /* Not USed */ - spi_config.mosi_pin = SPI_MOSI_PIN; - spi_config.sck_pin = SPI_SCLK_PIN; - spi_config.frequency = NRF_DRV_SPI_FREQ_1M; - spi_config.mode = NRF_DRV_SPI_MODE_0; - spi_config.bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST; - - APP_ERROR_CHECK(nrf_drv_spi_init(&spi_ada2200, &spi_config, NULL, NULL)); -} - - -extern void ada2200_uninit(void) -{ - nrf_drv_spi_uninit(&spi_ada2200); - - /* If SPIM2 is used: */ - *(volatile uint32_t *)0x40023FFC = 0; - *(volatile uint32_t *)0x40023FFC; - *(volatile uint32_t *)0x40023FFC = 1; - - nrf_gpio_cfg_default(SPI_CS_PIN); - nrf_gpio_cfg_default(SPI_MISO_PIN); - nrf_gpio_cfg_default(SPI_MOSI_PIN); - nrf_gpio_cfg_default(SPI_SCLK_PIN); -} - - diff --git a/project/ble_peripheral/ble_app_bladder_patch/ada2200_spi.h b/project/ble_peripheral/ble_app_bladder_patch/ada2200_spi.h deleted file mode 100644 index c9b7e94..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/ada2200_spi.h +++ /dev/null @@ -1,25 +0,0 @@ -/******************************************************************************* - * @file ada2200_spi.h - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#ifndef _ADA2200_SPI_H_ -#define _ADA2200_SPI_H_ - -#define SPI_INSTANCE 2 /**< SPI instance index. */ - -#define SPI_MOSI_PIN 16 -#define SPI_MISO_PIN 15 /* Not Used */ -#define SPI_SCLK_PIN 14 -#define SPI_CS_PIN 13 - -extern void ada2200_start(void); -extern void ada2200_stop(void); -extern void ada2200_init(void); -extern void ada2200_uninit(void); - -#endif //_ADA2200_SPI_H_ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.c b/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.c index dd4ae77..e74e68d 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.c +++ b/project/ble_peripheral/ble_app_bladder_patch/battery_saadc.c @@ -22,7 +22,6 @@ //#include "fstorage.h" #include "battery_saadc.h" #include "main_timer.h" -#include "meas_pd_48.h" #include #include "debug_print.h" #define BATTERY_REF_VOLTAGE_IN_MILLIVOLTS 600 /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ @@ -52,8 +51,8 @@ bool low_battery_check = false; extern bool info4; //cmd_parse // cj add edit 25/11/24 -extern volatile uint16_t info_p1; -extern volatile uint16_t info_p2; +volatile uint16_t info_p1; +volatile uint16_t info_p2; extern char ble_tx_buffer[BLE_NUS_MAX_DATA_LEN]; @@ -63,7 +62,7 @@ extern volatile bool processing; extern which_cmd_t cmd_type_t; extern uint8_t ble_bin_buffer[BLE_NUS_MAX_DATA_LEN] ; - extern volatile uint16_t info_batt; //48_c + volatile uint16_t info_batt; //48_c extern bool go_temp; // extern bool go_batt; //cmd_parse @@ -133,7 +132,7 @@ void pressure_all_event_handler(nrf_drv_saadc_evt_t const * p_event) result_data[0] = p1_mV; result_data[1] = p2_mV; format_data(ble_bin_buffer, "rpn:", result_data,2); - binary_tx_handler(ble_bin_buffer,4); + dr_binary_tx_safe(ble_bin_buffer,4); } @@ -199,7 +198,7 @@ void battery_event_handler( nrf_drv_saadc_evt_t const * p_event ) single_format_data(ble_bin_buffer, "rsn:", batt_lvl_in_milli_volt_1); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); //data_tx_handler(ble_tx_buffer); } } diff --git a/project/ble_peripheral/ble_app_bladder_patch/cat_i2c.c b/project/ble_peripheral/ble_app_bladder_patch/cat_i2c.c deleted file mode 100644 index 557ab13..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/cat_i2c.c +++ /dev/null @@ -1,163 +0,0 @@ -/******************************************************************************* - * @file cat_i2c.c - * @brief - ******************************************************************************/ - -#include -#include -#include - -#include -#include "nrf.h" -#include "app_error.h" -#include "boards.h" -#include "nrfx_gpiote.h" -#include "nrfx_twi.h" -#include "nrf_drv_twi.h" - -#include "nrf_delay.h" -#include "cat_i2c.h" - - - -#define CAT_I2C_ADDR 0x50 -#define MAX_SERIAL_WRITE 16 - -//int16_t read_from_DS3930 = 0; -//uint16_t data_160_to_write = 0; -//static volatile bool m_xfer_done = false; - -/* TWI instance. */ -//const nrfx_twi_t m_twi_ir = NRFX_TWI_INSTANCE(IR_I2C_INSTANCE); -const nrf_drv_twi_t m_twi_cat = NRF_DRV_TWI_INSTANCE (CAT_I2C_INSTANCE); -//void twi_handler(nrfx_twi_evt_t const * p_event, void * p_context) -//{ -// m_xfer_done = true; -//} -//void ir_irq_init(void){ -// ret_code_t err_code; - -// /* Initialize int pin */ -// if (!nrfx_gpiote_is_init()) -// { -// err_code = nrfx_gpiote_init(); -// APP_ERROR_CHECK(err_code); -// } - -// nrfx_gpiote_in_config_t in_config = NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(true); -// in_config.pull = NRF_GPIO_PIN_PULLDOWN; - -// err_code = nrfx_gpiote_in_init(ADA2200_SYNCO_PIN, &in_config, NULL); -// APP_ERROR_CHECK(err_code); - -// nrfx_gpiote_in_event_enable(ADA2200_SYNCO_PIN, true); -//} - - -//void ir_irq_uninit(void){ - -// nrfx_gpiote_in_event_disable(ADA2200_SYNCO_PIN); -// nrfx_gpiote_in_uninit(ADA2200_SYNCO_PIN); -//} -void cat_i2c_uninit(void){ - nrf_drv_twi_disable(&m_twi_cat); - nrf_drv_twi_uninit(&m_twi_cat); -// -} - - -void cat_i2c_init(void){ - ret_code_t err_code; - - const nrf_drv_twi_config_t twi_cat_config = { - .scl = CAT_I2C_SCL_PIN, - .sda = CAT_I2C_SDA_PIN, - .frequency = NRF_DRV_TWI_FREQ_100K, - .interrupt_priority = APP_IRQ_PRIORITY_HIGH, - .clear_bus_init = false - }; - - err_code = nrf_drv_twi_init(&m_twi_cat, &twi_cat_config, NULL, NULL); - APP_ERROR_CHECK(err_code); - - nrf_drv_twi_enable(&m_twi_cat); -// ir_irq_init(); -} - - - - -uint8_t cat_command_read(uint8_t device_id, uint8_t address, uint8_t *data) -{ - uint8_t read_data = 0; - char adata[8]; - ret_code_t err_code; - //address = 1|(address<<1); - address = (address & 0xFF); - err_code = nrf_drv_twi_tx(&m_twi_cat, device_id, &address, 1, true); - if (err_code != NRF_SUCCESS) { - // Handle error - // return; - } - - err_code = nrf_drv_twi_rx(&m_twi_cat, device_id, data, 8); - if (err_code != NRF_SUCCESS) { - // Handle error - return 0; - } - read_data = data[0]; - memcpy(adata,data,8); - printf("Data %s . \r\n", adata); - return read_data; -} - - - - - - -void cat_command_write(uint8_t device_id, uint8_t address, uint8_t *data) -{ - //uint16_t data_to_write = 0; - - uint8_t buffer[9]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; - - address = (address & 0xFF); - - //buffer[0] = 0x00; - buffer[0] = (address); -// buffer[1] =(data & 0xFF); -// buffer[2] = data1+1; -// buffer[3] = data1+2; -// buffer[4] = data1+3; -// buffer[5] = data1+4; -// buffer[6] = data1+5; - memcpy(&buffer[1], data, 8 ); - - - ret_code_t err_code; - //err_code = nrf_drv_twi_tx(&m_twi_ir, device_id, 0x00, 1, false); - - err_code = nrf_drv_twi_tx(&m_twi_cat, device_id, buffer, 9, false); - - - printf("Data %x %x %x %x. \r\n", buffer[0], buffer[1], buffer[2], buffer[3]); - printf("Data %s. \r\n", buffer); - - //err_code = nrf_drv_twi_tx(&m_twi_ir, device_id, buffer, 6, false); - if (err_code != NRF_SUCCESS) { - - printf("TWI Error.\r\n"); - - - } - -} - - - - - - - - diff --git a/project/ble_peripheral/ble_app_bladder_patch/cat_i2c.h b/project/ble_peripheral/ble_app_bladder_patch/cat_i2c.h deleted file mode 100644 index 1eb7060..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/cat_i2c.h +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************************* - * @file ir_i2c.h - * @date 2024-07-17 - ******************************************************************************/ - -#ifndef _CAT_I2C_H_ -#define _CAT_I2C_H_ - -#include "sdk_common.h" - -#include -#include "nrf.h" -#include "nrf_drv_gpiote.h" - - -#define CAT_I2C_INSTANCE 0 /**< I2C instance index. */ -#define CAT_I2C_SDA_PIN NRF_GPIO_PIN_MAP(1,15) -#define CAT_I2C_SCL_PIN NRF_GPIO_PIN_MAP(1,14) -//#define IR_I2C_SDA_PIN NRF_GPIO_PIN_MAP(0,25) -//#define IR_I2C_SCL_PIN NRF_GPIO_PIN_MAP(1,0) -/** - * COMMAND CONSTANTS - * Commands are 16-bit writes: bits 15:14 are 0s - * Bits 13:10 are the command value below - * Bits 9:0 are data for the command, but not all bits are used with all commands - */ - - - - - -void cat_i2c_uninit(void); -void cat_i2c_init(void); - - - - - - - - - - -uint8_t cat_command_read(uint8_t device_id, uint8_t address, uint8_t *data); -void cat_command_write(uint8_t device_id, uint8_t address, uint8_t *data); - - - -#endif /* !_ADA5272_I2C_H_ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/cat_interface.c b/project/ble_peripheral/ble_app_bladder_patch/cat_interface.c deleted file mode 100644 index 79a5407..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/cat_interface.c +++ /dev/null @@ -1,522 +0,0 @@ -/******************************************************************************* - * @file cat_interface.c - * @brief - ******************************************************************************/ - -/* board driver */ -#include -#include -#include - -#include -#include "nrf.h" -#include "app_error.h" -#include "boards.h" -#include "nrfx_gpiote.h" -#include "nrfx_twi.h" -#include "nrf_crypto.h" -#include "nrf_crypto_aes.h" - -#include "nrf_drv_twi.h" -#include "system_interface.h" -#include "nrf_delay.h" -#include "cat_interface.h" -#include "debug_print.h" -/* I2C number and slave address for INV device */ -#define ICM_I2C_ADDR 0x68 -#define INV_MAX_SERIAL_WRITE 16 - - -#define EEPROM_I2C_ADDRESS 0x50 -#define EEPROM_PAGE_SIZE 64 -#define EEPROM_INSTANCE 0 - - - -#define AES_BLOCK_SIZE 16 - -static uint8_t aes_key[16] = { - 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, - 0x2b, 0x73, 0xae, 0xf0, 0x85, 0x7d, 0x77, 0x81 -}; - -static uint8_t aes_iv[16] = { 0 }; // Fixed IV for simplicity - - - - -const nrfx_twi_t m_eeprom = NRFX_TWI_INSTANCE(EEPROM_INSTANCE); - - - - - -ret_code_t encrypt_data(const uint8_t *input, size_t length, uint8_t *output, size_t *output_len) { - nrf_crypto_aes_context_t aes_ctx; - size_t padded_len = ((length + AES_BLOCK_SIZE - 1) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE; - - uint8_t buffer[padded_len]; - memcpy(buffer, input, length); - memset(&buffer[length], 0, padded_len - length); // Zero padding - - ret_code_t err = nrf_crypto_aes_init(&aes_ctx, &g_nrf_crypto_aes_cbc_128_info, NRF_CRYPTO_ENCRYPT); - VERIFY_SUCCESS(err); - - err = nrf_crypto_aes_key_set(&aes_ctx, aes_key); - VERIFY_SUCCESS(err); - - err = nrf_crypto_aes_iv_set(&aes_ctx, aes_iv); - VERIFY_SUCCESS(err); - - *output_len = padded_len; - err = nrf_crypto_aes_finalize(&aes_ctx, buffer, padded_len, output, output_len); - return err; -} - -ret_code_t decrypt_data(const uint8_t *input, size_t length, uint8_t *output) { - nrf_crypto_aes_context_t aes_ctx; - uint8_t input_copy[length]; - memcpy(input_copy, input, length); - - ret_code_t err = nrf_crypto_aes_init(&aes_ctx, &g_nrf_crypto_aes_cbc_128_info, NRF_CRYPTO_DECRYPT); - VERIFY_SUCCESS(err); - - err = nrf_crypto_aes_key_set(&aes_ctx, aes_key); - VERIFY_SUCCESS(err); - - err = nrf_crypto_aes_iv_set(&aes_ctx, aes_iv); - VERIFY_SUCCESS(err); - - size_t output_len = length; - err = nrf_crypto_aes_finalize(&aes_ctx, input_copy, length, output, &output_len); - return err; -} - -ret_code_t eeprom_write_encrypted(uint16_t mem_address, const uint8_t *plaintext, size_t length) { - uint8_t encrypted_buf[256]; // Adjust if needed - size_t encrypted_len = 0; - - ret_code_t err = encrypt_data(plaintext, length, encrypted_buf, &encrypted_len); - VERIFY_SUCCESS(err); - - return eeprom_write_bytes(mem_address, encrypted_buf, encrypted_len); -} - - -ret_code_t eeprom_read_decrypted(uint16_t mem_address, uint8_t *plaintext, size_t original_length) { - size_t encrypted_len = ((original_length + AES_BLOCK_SIZE - 1) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE; - uint8_t encrypted_buf[256]; // Adjust as needed - - ret_code_t err = eeprom_read_bytes(mem_address, encrypted_buf, encrypted_len); - VERIFY_SUCCESS(err); - - return decrypt_data(encrypted_buf, encrypted_len, plaintext); -} - - - - -void eeprom_uninitialize(void){ - nrfx_twi_disable(&m_eeprom); - nrfx_twi_uninit(&m_eeprom); -} - -void eeprom_initialize(void){ - ret_code_t err_code; - - const nrfx_twi_config_t eeprom_config = { - .scl = ICM42670_I2C_SCL_PIN, - .sda = ICM42670_I2C_SDA_PIN, - .frequency = NRF_TWI_FREQ_400K, - .interrupt_priority = APP_IRQ_PRIORITY_HIGH, - }; - - err_code = nrfx_twi_init(&m_eeprom, &eeprom_config, NULL, NULL); - APP_ERROR_CHECK(err_code); - - nrfx_twi_enable(&m_eeprom); -} - -ret_code_t eeprom_write_page(uint16_t mem_address, const uint8_t *data) -{ - - uint8_t buffer[2 + EEPROM_PAGE_SIZE]; // 2 bytes for address + 64 bytes data - ret_code_t ret; - - buffer[0] = (uint8_t)(mem_address >> 8); // MSB - buffer[1] = (uint8_t)(mem_address & 0xFF); // LSB - memcpy(&buffer[2], data, EEPROM_PAGE_SIZE); - - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, buffer, 2 + EEPROM_PAGE_SIZE, false); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM write failed (code: %d)\n", ret); - return ret; - } - - // Wait for internal EEPROM write cycle (typically ~5ms) - for (int i = 0; i < 100; i++) { - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, NULL, 0, false); - if (ret == NRF_SUCCESS) - break; - nrf_delay_us(100); // Wait 100us before retry -} - - return NRF_SUCCESS; -} - - -ret_code_t eeprom_write_uint16_array(uint16_t start_address, const uint16_t *data, size_t count) -{ - - if (count != 48) { - DBG_PRINTF("Error: This function is only for writing exactly 48 uint16_t values.\n"); - return NRF_ERROR_INVALID_PARAM; - } - if (start_address < 128) { - DBG_PRINTF("Error: This function is only for after 192....\n"); - return NRF_ERROR_INVALID_PARAM; - } - - uint8_t buffer[EEPROM_PAGE_SIZE]; - ret_code_t ret; - - // Write first 32 uint16_t values (64 bytes) - for (size_t i = 0; i < 32; i++) { - buffer[i * 2] = (uint8_t)(data[i] >> 8); // MSB - buffer[i * 2 + 1] = (uint8_t)(data[i] & 0xFF); // LSB -// buffer[i * 2 +1] = (uint8_t)(data[i] >> 8); // MSB -// buffer[i * 2 ] = (uint8_t)(data[i] & 0xFF); // LSB - } - - ret = eeprom_write_page(start_address, buffer); - if (ret != NRF_SUCCESS) { - return ret; - } - - // Write remaining 16 uint16_t values (32 bytes) - for (size_t i = 0; i < 16; i++) { - buffer[i * 2] = (uint8_t)(data[i + 32] >> 8); - buffer[i * 2 + 1] = (uint8_t)(data[i + 32] & 0xFF); - } - - ret = eeprom_write_page(start_address + EEPROM_PAGE_SIZE, buffer); // next page - return ret; -} - - - -ret_code_t eeprom_read_uint16_array(uint16_t start_address, uint16_t *data, size_t count) -{ - - - if (count != 48) { - DBG_PRINTF("Error: This function is only for reading exactly 48 uint16_t values.\n"); - return NRF_ERROR_INVALID_PARAM; - } - - uint8_t buffer[EEPROM_PAGE_SIZE]; - ret_code_t ret; - - // Read first 64 bytes (32 uint16_t) - ret = eeprom_read_bytes(start_address, buffer, EEPROM_PAGE_SIZE); - if (ret != NRF_SUCCESS) { - return ret; - } - - for (size_t i = 0; i < 32; i++) { - data[i] = ((uint16_t)buffer[i * 2] << 8) | buffer[i * 2 + 1]; - } - - // Read next 32 bytes (16 uint16_t) - ret = eeprom_read_bytes(start_address + EEPROM_PAGE_SIZE, buffer, 32); - if (ret != NRF_SUCCESS) { - return ret; - } - - for (size_t i = 0; i < 16; i++) { - data[i + 32] = ((uint16_t)buffer[i * 2] << 8) | buffer[i * 2 + 1]; - } - - return NRF_SUCCESS; -} - -ret_code_t eeprom_read_page(uint16_t mem_address, uint8_t *data) -{ - - uint8_t addr_buf[2]; - ret_code_t ret; - - addr_buf[0] = (uint8_t)(mem_address >> 8); - addr_buf[1] = (uint8_t)(mem_address & 0xFF); - - // Send memory address first - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, addr_buf, 2, true); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM set read address failed (code: %d)\n", ret); - return ret; - } - - // Read the page - ret = icm42670_twi_rx(EEPROM_I2C_ADDRESS, data, EEPROM_PAGE_SIZE); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM read failed (code: %d)\n", ret); - return ret; - } - DBG_PRINTF("EEPROM read \n"); - for (int i = 0; i < EEPROM_PAGE_SIZE; i++) { - - DBG_PRINTF("%02X\n", data[i]); - } - DBG_PRINTF("\r\n"); - return NRF_SUCCESS; -} - - - - -ret_code_t eeprom_write_byte(uint16_t mem_address, uint8_t data) -{ - - uint8_t buffer[3]; // 2 bytes for address + 1 byte data - ret_code_t ret; - - buffer[0] = (uint8_t)(mem_address >> 8); // MSB of address - buffer[1] = (uint8_t)(mem_address & 0xFF); // LSB of address - buffer[2] = data; - DBG_PRINTF("EEPROM write byte %02X,%02X,%02X\n", buffer[0], buffer[1], buffer[2]); - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, buffer, 3, false); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM write byte failed (code: %d)\n", ret); - return ret; - } - - // Wait for internal EEPROM write cycle (typically ~5ms) - for (int i = 0; i < 100; i++) { - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, NULL, 0, false); - if (ret == NRF_SUCCESS) - break; - nrf_delay_us(100); // Wait 100us before retry -} - - return NRF_SUCCESS; -} - -ret_code_t eeprom_read_byte(uint16_t mem_address, uint8_t *data) -{ - - uint8_t addr_buf[2]; - ret_code_t ret; - - addr_buf[0] = (uint8_t)(mem_address >> 8); // MSB of address - addr_buf[1] = (uint8_t)(mem_address & 0xFF); // LSB of address - - // Send memory address - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, addr_buf, 2, true); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM set address failed (code: %d)\n", ret); - return ret; - } - - // Read 1 byte - ret = icm42670_twi_rx(EEPROM_I2C_ADDRESS, data, 1); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM read byte failed (code: %d)\n", ret); - return ret; - } - - return NRF_SUCCESS; -} - - -ret_code_t eeprom_write_bytes(uint16_t mem_address, const uint8_t *data, size_t length) -{ - - ret_code_t ret; - size_t bytes_written = 0; - - while (bytes_written < length) { - size_t page_offset = mem_address % EEPROM_PAGE_SIZE; - size_t bytes_to_write = EEPROM_PAGE_SIZE - page_offset; - if (bytes_to_write > (length - bytes_written)) { - bytes_to_write = length - bytes_written; - } - - uint8_t buffer[2 + EEPROM_PAGE_SIZE]; // 2-byte addr + up to 64 data bytes - buffer[0] = (uint8_t)(mem_address >> 8); - buffer[1] = (uint8_t)(mem_address & 0xFF); - memcpy(&buffer[2], &data[bytes_written], bytes_to_write); - - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, buffer, bytes_to_write + 2, false); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM write error at addr 0x%04X\n", mem_address); - return ret; - } - // Wait for internal EEPROM write cycle (typically ~5ms) - for (int i = 0; i < 100; i++) { - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, NULL, 0, false); - if (ret == NRF_SUCCESS) - break; - nrf_delay_us(100); // Wait 100us before retry -} - - mem_address += bytes_to_write; - bytes_written += bytes_to_write; - } - - return NRF_SUCCESS; -} - -ret_code_t eeprom_read_bytes(uint16_t mem_address, uint8_t *data, size_t length) -{ - - ret_code_t ret; - uint8_t addr_buf[2]; - - addr_buf[0] = (uint8_t)(mem_address >> 8); - addr_buf[1] = (uint8_t)(mem_address & 0xFF); - - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, addr_buf, 2, true); // send addr, no stop - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM read set address failed\n"); - return ret; - } - - ret = icm42670_twi_rx(EEPROM_I2C_ADDRESS, data, length); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM read failed\n"); - return ret; - } - - return NRF_SUCCESS; -} - -ret_code_t eeprom_write_word(uint16_t mem_address, uint16_t data) -{ - - uint8_t buffer[4]; // 2 bytes for address + 2 bytes for data - ret_code_t ret; - - buffer[0] = (uint8_t)(mem_address >> 8); // MSB of address - buffer[1] = (uint8_t)(mem_address & 0xFF); // LSB of address - buffer[2] = (uint8_t)(data & 0xFF); // LSB of data - buffer[3] = (uint8_t)(data >> 8); // MSB of data - - DBG_PRINTF("EEPROM write word %02X,%02X,%02X,%02X\n", buffer[0], buffer[1], buffer[2], buffer[3]); - - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, buffer, 4, false); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM write word failed (code: %d)\n", ret); - return ret; - } - - // Wait for internal write cycle (~5ms typical) - for (int i = 0; i < 100; i++) { - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, NULL, 0, false); - if (ret == NRF_SUCCESS) - break; - nrf_delay_us(100); // 100us delay between polling - } - - return NRF_SUCCESS; -} - - -ret_code_t eeprom_read_word(uint16_t mem_address, uint16_t *data) -{ - - uint8_t addr_buf[2]; - uint8_t read_buf[2]; - ret_code_t ret; - - addr_buf[0] = (uint8_t)(mem_address >> 8); - addr_buf[1] = (uint8_t)(mem_address & 0xFF); - - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, addr_buf, 2, true); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM set address for word read failed (code: %d)\n", ret); - return ret; - } - - ret = icm42670_twi_rx(EEPROM_I2C_ADDRESS, read_buf, 2); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM read word failed (code: %d)\n", ret); - return ret; - } - - *data = ((uint16_t)read_buf[1] << 8) | read_buf[0]; // Little-endian - - return NRF_SUCCESS; -} - -ret_code_t eeprom_write_uint32(uint16_t mem_address, uint32_t data) -{ - - uint8_t buffer[6]; // 2 bytes address + 4 bytes data - ret_code_t ret; - - buffer[0] = (uint8_t)(mem_address >> 8); // MSB of address - buffer[1] = (uint8_t)(mem_address & 0xFF); // LSB of address - buffer[2] = (uint8_t)(data >> 24); - buffer[3] = (uint8_t)(data >> 16); - buffer[4] = (uint8_t)(data >> 8); - buffer[5] = (uint8_t)(data); - - DBG_PRINTF("EEPROM write uint32: %02X %02X %02X %02X %02X %02X\n", - buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]); - - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, buffer, 6, false); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM write uint32 failed (code: %d)\n", ret); - return ret; - } - - // Wait for internal EEPROM write cycle - for (int i = 0; i < 100; i++) { - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, NULL, 0, false); - if (ret == NRF_SUCCESS) - break; - nrf_delay_us(100); - } - - return NRF_SUCCESS; -} - - - - -ret_code_t eeprom_read_uint32(uint16_t mem_address, uint32_t *data) -{ - uint8_t addr_buf[2]; - uint8_t data_buf[4]; - ret_code_t ret; - - - addr_buf[0] = (uint8_t)(mem_address >> 8); - addr_buf[1] = (uint8_t)(mem_address & 0xFF); - - DBG_PRINTF("EEPROM address:%02X,%02X \n",addr_buf[0],addr_buf[1]); - // Send memory address to read from - ret = icm42670_twi_tx(EEPROM_I2C_ADDRESS, addr_buf, 2, true); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM read (addr phase) failed (code: %d)\n", ret); - return ret; - } - - // Read 4 bytes of data - ret = icm42670_twi_rx(EEPROM_I2C_ADDRESS, data_buf, 4); - if (ret != NRF_SUCCESS) { - DBG_PRINTF("EEPROM read (data phase) failed (code: %d)\n", ret); - return ret; - } - - *data = ((uint32_t)data_buf[0] << 24) | - ((uint32_t)data_buf[1] << 16) | - ((uint32_t)data_buf[2] << 8) | - ((uint32_t)data_buf[3]); - - DBG_PRINTF("EEPROM read uint32: %02X %02X %02X %02X -> %08X\n", - data_buf[0], data_buf[1], data_buf[2], data_buf[3], *data); - - return NRF_SUCCESS; -} - diff --git a/project/ble_peripheral/ble_app_bladder_patch/cat_interface.h b/project/ble_peripheral/ble_app_bladder_patch/cat_interface.h deleted file mode 100644 index df8849d..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/cat_interface.h +++ /dev/null @@ -1,66 +0,0 @@ -/******************************************************************************* - * @file app_raw_main.h - - ******************************************************************************/ - -#ifndef _CAT_INTERFACE_H_ -#define _CAT_INTERFACE_H_ -#include "sdk_config.h" -#include -#include -#include -#include -#include -#include "nordic_common.h" -#include "nrf.h" -#include "sdk_errors.h" -#define EEPROM_I2C_ADDRESS 0x50 -#define EEPROM_PAGE_SIZE 64 -#define SERIAL_ADDRESS 0x0030 - - -ret_code_t encrypt_data(const uint8_t *input, size_t length, uint8_t *output, size_t *output_len); - -ret_code_t decrypt_data(const uint8_t *input, size_t length, uint8_t *output); - -ret_code_t eeprom_write_encrypted(uint16_t mem_address, const uint8_t *plaintext, size_t length); - - -ret_code_t eeprom_read_decrypted(uint16_t mem_address, uint8_t *plaintext, size_t original_length); - - - -ret_code_t eeprom_read_page(uint16_t mem_address, uint8_t *data); - -ret_code_t eeprom_write_page(uint16_t mem_address, const uint8_t *data); - -ret_code_t eeprom_write_byte(uint16_t mem_address, uint8_t data); - -ret_code_t eeprom_read_byte(uint16_t mem_address, uint8_t *data); - -ret_code_t eeprom_write_bytes(uint16_t mem_address, const uint8_t *data, size_t length); - -ret_code_t eeprom_read_bytes(uint16_t mem_address, uint8_t *data, size_t length); - -ret_code_t eeprom_write_uint16_array(uint16_t start_address, const uint16_t *data, size_t count); - -ret_code_t eeprom_read_uint16_array(uint16_t start_address, uint16_t *data, size_t count); - -ret_code_t eeprom_write_word(uint16_t mem_address, uint16_t data); - -ret_code_t eeprom_read_word(uint16_t mem_address, uint16_t *data); - - -void eeprom_uninitialize(void); - -void eeprom_initialize(void); - - - -ret_code_t eeprom_write_uint32(uint16_t mem_address, uint32_t data); - -ret_code_t eeprom_read_uint32(uint16_t mem_address, uint32_t *data); - - -#endif /* */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_adc121s051.c b/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_adc121s051.c deleted file mode 100644 index 0446a22..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_adc121s051.c +++ /dev/null @@ -1,1515 +0,0 @@ -/******************************************************************************* - * @file dr_adc121s051.c - * @brief ADC121S051 12-bit ADC Driver for nRF52840 - * For 1.2MHz Piezo Echo Envelope Detection - * @author Charles KWON - * @date 2025-12-15 - * - * @details Software SPI (bit-bang) implementation for ADC121S051. - * Optimized for reading envelope-detected echo signals. - * - * ADC121S051 Serial Interface: - * - * CS ────────┐ ┌──────── - * (HIGH) └──────────────────────────────┘ (HIGH) - * - * SCLK ────────┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ──────── - * (HIGH) └──┘ └──┘ └── ... ┘ └──┘ └──┘ (HIGH) - * 1 2 3 14 15 16 - * - * SDATA -------...------ - * |<- 3 zeros ->|<-- 12 data bits -->| - * - * - CS idle HIGH, SCLK idle HIGH - * - CS falling edge: starts conversion, samples VIN - * - Data clocked out on SCLK falling edge - * - MSB first, straight binary output - * - * @note WARNING: Never hardcode pin numbers! - * Hardcoding may save a developer's time momentarily, - * but it will also shorten their lifespan. - ******************************************************************************/ - -#include "dr_adc121s051.h" -#include "dr_util.h" -#include "nrf_gpio.h" -#include "nrf_delay.h" -#include /* memset */ - -/* BLE connection state from main.c */ -extern volatile bool data_tx_in_progress; -extern volatile bool ble_connection_st; - -/*============================================================================== - * EXTERNAL PIEZO BURST FUNCTIONS - *============================================================================*/ -extern void dr_piezo_burst_sw(uint8_t cycles); -extern void dr_piezo_burst_sw_18mhz(uint8_t cycles); -extern void dr_piezo_burst_sw_20mhz(uint8_t cycles); -extern void dr_piezo_burst_sw_17mhz(uint8_t cycles); - -/*============================================================================== - * DEBUG CONFIGURATION - *============================================================================*/ -#ifdef DEBUG_ADC -#include "nrf_log.h" -#define ADC_LOG(...) NRF_LOG_INFO(__VA_ARGS__) -#else -#define ADC_LOG(...) -#endif - -/*============================================================================== - * PRIVATE DEFINES - *============================================================================*/ - -/* Extract pin number from NRF_GPIO_PIN_MAP (lower 5 bits) */ -#define DR_PIN_NUM(pin) ((pin) & 0x1F) -#define DR_PIN_PORT(pin) (((pin) >> 5) & 0x01) - -/* SPI bit masks for direct register access */ -#define CS_MASK (1UL << DR_PIN_NUM(DR_ADC_PIN_CS)) -#define SCLK_MASK (1UL << DR_PIN_NUM(DR_ADC_PIN_SCLK)) -#define SDATA_MASK (1UL << DR_PIN_NUM(DR_ADC_PIN_SDATA)) - -/* Get port register based on pin */ -#define DR_GET_PORT(pin) (DR_PIN_PORT(pin) ? NRF_P1 : NRF_P0) - -/* ADC timing constants */ -#define SCLK_CYCLES 16 /**< Clock cycles per conversion */ - -/*============================================================================== - * PRIVATE VARIABLES - *============================================================================*/ - -static bool m_initialized = false; -static uint32_t m_vref_mv = DR_ADC_VREF_MV; - -/* Echo capture buffer (module-level for external access) */ -static uint16_t m_echo_buffer[DR_ADC_ECHO_SAMPLES_MAX]; - -/* Port registers for fast access (currently unused - using direct NRF_P0) */ -/* static NRF_GPIO_Type *m_port_cs; */ -/* static NRF_GPIO_Type *m_port_sclk; */ -/* static NRF_GPIO_Type *m_port_sdata; */ - -/*============================================================================== - * PRIVATE FUNCTION PROTOTYPES - *============================================================================*/ - -static void adc_gpio_init(void); -/* adc_transfer is always_inline, no prototype needed */ - -/*============================================================================== - * INLINE GPIO FUNCTIONS (for speed) - *============================================================================*/ - -/* cs_low() unused - using ADC_TRANSFER_16BITS macro with direct register access -static inline void cs_low(void) -{ - NRF_P0->OUTCLR = CS_MASK; -} -*/ - -static inline void cs_high(void) -{ - NRF_P0->OUTSET = CS_MASK; -} - -/* sclk_low() unused - using direct register access in macro -static inline void sclk_low(void) -{ - NRF_P0->OUTCLR = SCLK_MASK; -} -*/ - -static inline void sclk_high(void) -{ - NRF_P0->OUTSET = SCLK_MASK; -} - -/* read_sdata() unused - using direct register access in macro -static inline uint32_t read_sdata(void) -{ - return (NRF_P0->IN & SDATA_MASK) ? 1 : 0; -} -*/ - -/*============================================================================== - * PRIVATE FUNCTIONS - *============================================================================*/ - -/** - * @brief Initialize GPIO pins for ADC - */ -static void adc_gpio_init(void) -{ - /* Port pointers removed - using direct NRF_P0 access for speed */ - - /* CS: Output, HIGH (idle) */ - nrf_gpio_cfg_output(DR_ADC_PIN_CS); - nrf_gpio_pin_set(DR_ADC_PIN_CS); - - /* SCLK: Output, HIGH (idle) - per Figure 4 */ - nrf_gpio_cfg_output(DR_ADC_PIN_SCLK); - nrf_gpio_pin_set(DR_ADC_PIN_SCLK); - - /* SDATA: Input (ADC has push-pull output) */ - nrf_gpio_cfg_input(DR_ADC_PIN_SDATA, NRF_GPIO_PIN_NOPULL); - - ADC_LOG("ADC GPIO: CS=P%d.%02d SCLK=P%d.%02d SDATA=P%d.%02d", - DR_PIN_PORT(DR_ADC_PIN_CS), DR_PIN_NUM(DR_ADC_PIN_CS), - DR_PIN_PORT(DR_ADC_PIN_SCLK), DR_PIN_NUM(DR_ADC_PIN_SCLK), - DR_PIN_PORT(DR_ADC_PIN_SDATA), DR_PIN_NUM(DR_ADC_PIN_SDATA)); -} - -/** - * @brief Perform one ADC conversion (16 clock cycles) - * @return Raw 16-bit data (includes leading zeros) - * - * @details Timing optimized for maximum speed (~500ksps). - * At 64MHz CPU: 1 NOP = 15.625ns - * - * ADC specs (@ 3.3V): - * - tACC (data access time): 40ns max - * - tH (hold time): 7ns min - * - fSCLK: 4-10 MHz - * - * MUST be inlined to eliminate function call overhead for consistent timing. - */ -/* - * ADC_TRANSFER_BIT macro - one SCLK cycle for bit-bang SPI - * Captures data on falling edge, processes on rising edge - * - * Target: 10MHz (100ns cycle) = 50ns LOW + 50ns HIGH - * ADC121S051 timing requirements: - * - tCL (SCLK low time): 40ns min - * - tCH (SCLK high time): 40ns min - * - tACC (data access): 40ns max (data valid after SCLK falling) - * - * LOW phase: OUTCLR(~15ns) + NOP(~16ns) + IN read(~30ns) = ~61ns (meets tCL, tACC) - * HIGH phase: OUTSET(~15ns) + shift/OR(~40ns) = ~55ns (meets tCH) - * Total: ~116ns (~8.6MHz) - * - * Note: Removing HIGH phase NOP to reduce cycle time - */ -#define ADC_TRANSFER_BIT(data, in_reg) \ - do { \ - NRF_P0->OUTCLR = SCLK_MASK; \ - __NOP(); \ - in_reg = NRF_P0->IN; \ - NRF_P0->OUTSET = SCLK_MASK; \ - data = (data << 1) | ((in_reg & SDATA_MASK) ? 1 : 0); \ - } while(0) - -#define ADC_TRANSFER_BIT_LAST(data, in_reg) \ - do { \ - NRF_P0->OUTCLR = SCLK_MASK; \ - __NOP(); \ - in_reg = NRF_P0->IN; \ - NRF_P0->OUTSET = SCLK_MASK; \ - data = (data << 1) | ((in_reg & SDATA_MASK) ? 1 : 0); \ - } while(0) - -/* - * ADC_TRANSFER_16BITS macro - Complete 16-bit transfer - * Use this instead of adc_transfer() function for consistent first bit timing. - * Variables data and in_reg MUST be declared and initialized before calling. - * - * IMPORTANT: Call ADC_PREHEAT(data, in_reg) before cs_low() to warm up pipeline. - */ -#define ADC_TRANSFER_16BITS(data, in_reg) \ - do { \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 15 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 14 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 13 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 12 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 11 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 10 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 9 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 8 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 7 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 6 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 5 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 4 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 3 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 2 */ \ - ADC_TRANSFER_BIT(data, in_reg); /* Bit 1 */ \ - ADC_TRANSFER_BIT_LAST(data, in_reg); /* Bit 0 */ \ - NRF_P0->OUTSET = CS_MASK; \ - __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); \ - __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); \ - __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); \ - __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); \ - } while(0) - -/* - * ADC_PREHEAT - Warm up instruction pipeline before timing-critical section - * This prevents the first SCLK cycle from being longer than others. - * - * CRITICAL: Must perform ACTUAL SCLK toggle to prime the GPIO write path! - * CS is still HIGH (idle), so this dummy toggle doesn't affect ADC. - * - * Sequence: - * 1. Dummy SCLK LOW/HIGH cycle (exact same code as ADC_TRANSFER_BIT) - * 2. SCLK remains HIGH (ready for cs_low) - */ -#define ADC_PREHEAT(data, in_reg) \ - do { \ - /* Dummy SCLK cycle - CS still HIGH, so ADC ignores this */ \ - /* Must match ADC_TRANSFER_BIT timing exactly */ \ - NRF_P0->OUTCLR = SCLK_MASK; \ - __NOP(); \ - in_reg = NRF_P0->IN; \ - NRF_P0->OUTSET = SCLK_MASK; \ - data = (data << 1) | ((in_reg & SDATA_MASK) ? 1 : 0); \ - /* Second dummy cycle for better pipeline warm-up */ \ - NRF_P0->OUTCLR = SCLK_MASK; \ - __NOP(); \ - in_reg = NRF_P0->IN; \ - NRF_P0->OUTSET = SCLK_MASK; \ - data = (data << 1) | ((in_reg & SDATA_MASK) ? 1 : 0); \ - /* Reset data after priming */ \ - data = 0; \ - } while(0) - -/* adc_transfer() function replaced by ADC_TRANSFER_16BITS macro for speed - * Kept here for reference but commented out to eliminate warning - */ -#if 0 -/** - * @brief Perform one ADC conversion (16 clock cycles) - * @param data Pre-initialized to 0 by caller - * @param in_reg Pre-declared register variable by caller - * @return Raw 16-bit data (includes leading zeros) - */ -__attribute__((always_inline)) -static inline uint16_t adc_transfer(uint16_t data, register uint32_t in_reg) -{ - /* Implementation moved to ADC_TRANSFER_16BITS macro */ - return data; -} -#endif - -/*============================================================================== - * PUBLIC FUNCTIONS - INITIALIZATION - *============================================================================*/ - -dr_adc_err_t dr_adc_init(void) -{ - ADC_LOG("ADC121S051 init..."); - - /* Initialize GPIO */ - adc_gpio_init(); - - /* Ensure idle state (SCLK idle HIGH per Figure 4) */ - cs_high(); - sclk_high(); - - /* Wait for power stabilization */ - nrf_delay_us(10); - - /* Dummy read to wake up and clear stale data */ - { - uint16_t dummy_data = 0; - register uint32_t dummy_reg = 0; - ADC_PREHEAT(dummy_data, dummy_reg); - NRF_P0->OUTCLR = CS_MASK; - __NOP(); __NOP(); __NOP(); __NOP(); /* tSU: CS setup time */ - ADC_TRANSFER_16BITS(dummy_data, dummy_reg); - } - - /* Quiet time between conversions */ - __NOP(); __NOP(); __NOP(); __NOP(); - - m_initialized = true; - - ADC_LOG("ADC121S051 ready (VREF=%dmV)", m_vref_mv); - - return DR_ADC_OK; -} - -void dr_adc_uninit(void) -{ - if (!m_initialized) return; - - cs_high(); - sclk_high(); /* Idle HIGH per Figure 4 */ - - nrf_gpio_cfg_default(DR_ADC_PIN_CS); - nrf_gpio_cfg_default(DR_ADC_PIN_SCLK); - nrf_gpio_cfg_default(DR_ADC_PIN_SDATA); - - m_initialized = false; - - ADC_LOG("ADC121S051 uninitialized"); -} - -bool dr_adc_is_initialized(void) -{ - return m_initialized; -} - -/*============================================================================== - * PUBLIC FUNCTIONS - BASIC READ - *============================================================================*/ - -dr_adc_err_t dr_adc_read_raw(uint16_t *raw_value) -{ - if (!m_initialized) return DR_ADC_ERR_NOT_INIT; - if (raw_value == NULL) return DR_ADC_ERR_INVALID_PARAM; - - uint16_t data = 0; - register uint32_t in_reg = 0; - - /* Critical section for precise timing */ - __disable_irq(); - - /* Preheat pipeline before timing-critical section */ - ADC_PREHEAT(data, in_reg); - - /* CS LOW - starts conversion, samples VIN on this edge */ - NRF_P0->OUTCLR = CS_MASK; - __NOP(); /* Match timing with other SCLK cycles */ - - /* Transfer 16 bits + CS HIGH (macro for consistent timing) */ - ADC_TRANSFER_16BITS(data, in_reg); - - __enable_irq(); - - /* - * Extract 12-bit data from 16-bit frame: - * Bit 15-13: Leading zeros (Z2, Z1, Z0) - must be 0 - * Bit 12-1: Data bits (D11-D0) - * Bit 0: Don't care (trailing) - * - * Result = (data >> 1) & 0x0FFF - */ - - /* Verify leading zeros (upper 3 bits should be 0) */ - if ((data & 0xE000) != 0) - { - ADC_LOG("ADC frame error: leading zeros invalid (0x%04X)", data); - } - - *raw_value = (data >> 1) & 0x0FFF; - - return DR_ADC_OK; -} - -dr_adc_err_t dr_adc_read(dr_adc_result_t *result) -{ - if (!m_initialized) return DR_ADC_ERR_NOT_INIT; - if (result == NULL) return DR_ADC_ERR_INVALID_PARAM; - - dr_adc_err_t err = dr_adc_read_raw(&result->raw); - if (err != DR_ADC_OK) return err; - - result->voltage_mv = dr_adc_raw_to_mv(result->raw); - - return DR_ADC_OK; -} - -dr_adc_err_t dr_adc_read_averaged(dr_adc_result_t *result, uint16_t num_samples) -{ - if (!m_initialized) return DR_ADC_ERR_NOT_INIT; - if (result == NULL) return DR_ADC_ERR_INVALID_PARAM; - if (num_samples == 0 || num_samples > DR_ADC_ECHO_SAMPLES_MAX) - return DR_ADC_ERR_INVALID_PARAM; - - uint32_t sum = 0; - uint16_t raw; - - for (uint16_t i = 0; i < num_samples; i++) - { - dr_adc_err_t err = dr_adc_read_raw(&raw); - if (err != DR_ADC_OK) return err; - sum += raw; - } - - result->raw = (uint16_t)(sum / num_samples); - result->voltage_mv = dr_adc_raw_to_mv(result->raw); - - return DR_ADC_OK; -} - -/*============================================================================== - * PUBLIC FUNCTIONS - ECHO DETECTION - *============================================================================*/ - -dr_adc_err_t dr_adc_capture_echo(uint16_t *buffer, uint16_t num_samples) -{ - if (!m_initialized) return DR_ADC_ERR_NOT_INIT; - if (buffer == NULL) return DR_ADC_ERR_INVALID_PARAM; - if (num_samples == 0 || num_samples > DR_ADC_ECHO_SAMPLES_MAX) - return DR_ADC_ERR_INVALID_PARAM; - - uint16_t data = 0; - register uint32_t in_reg = 0; - - /* Disable interrupts for continuous high-speed capture */ - __disable_irq(); - - /* Preheat pipeline once before the loop */ - ADC_PREHEAT(data, in_reg); - - for (uint16_t i = 0; i < num_samples; i++) - { - data = 0; /* Reset for each sample */ - - /* CS LOW - starts conversion, samples VIN */ - NRF_P0->OUTCLR = CS_MASK; - __NOP(); /* Match timing with other SCLK cycles */ - - /* Transfer 16 bits + CS HIGH (macro for consistent timing) */ - ADC_TRANSFER_16BITS(data, in_reg); - - /* Store 12-bit value */ - buffer[i] = (data >> 1) & 0x0FFF; - } - - __enable_irq(); - - return DR_ADC_OK; -} - -dr_adc_err_t dr_adc_measure_echo(dr_adc_echo_t *echo, const dr_adc_echo_config_t *config) -{ - if (!m_initialized) return DR_ADC_ERR_NOT_INIT; - if (echo == NULL) return DR_ADC_ERR_INVALID_PARAM; - - /* Use default config if not provided */ - dr_adc_echo_config_t cfg; - if (config != NULL) - { - cfg = *config; - } - else - { - cfg.num_samples = DR_ADC_ECHO_SAMPLES_DEFAULT; - cfg.threshold_raw = 100; /* ~80mV threshold */ - cfg.delay_us = 0; - } - - /* Validate config */ - if (cfg.num_samples == 0 || cfg.num_samples > DR_ADC_ECHO_SAMPLES_MAX) - return DR_ADC_ERR_INVALID_PARAM; - - /* Use module-level buffer (16KB too large for stack) */ - - /* Optional delay before capture */ - if (cfg.delay_us > 0) - { - nrf_delay_us(cfg.delay_us); - } - - /* Capture echo samples into module-level buffer */ - dr_adc_err_t err = dr_adc_capture_echo(m_echo_buffer, cfg.num_samples); - if (err != DR_ADC_OK) return err; - - /* Analyze captured data */ - return dr_adc_analyze_echo(m_echo_buffer, cfg.num_samples, echo, cfg.threshold_raw); -} - -dr_adc_err_t dr_adc_burst_and_capture(uint8_t cycles, uint16_t delay_us, - uint16_t num_samples, dr_adc_echo_t *echo) -{ - (void)cycles; /* Not used - ADC test only */ - - if (echo == NULL) return DR_ADC_ERR_INVALID_PARAM; - if (num_samples == 0 || num_samples > DR_ADC_ECHO_SAMPLES_MAX) - return DR_ADC_ERR_INVALID_PARAM; - - /* Initialize echo structure */ - echo->peak_raw = 0; - echo->peak_mv = 0; - echo->peak_index = 0; - echo->peak_time_us = 0; - echo->baseline_raw = 0; - echo->num_samples = 0; - - /* Initialize ADC if not ready */ - if (!m_initialized) - { - dr_adc_err_t init_err = dr_adc_init(); - if (init_err != DR_ADC_OK) return init_err; - } - - /* Settling time for ADC power */ - nrf_delay_us(100); - - /* Optional delay before capture */ - if (delay_us > 0) - { - nrf_delay_us(delay_us); - } - - /* Capture ADC samples into module-level buffer */ - dr_adc_err_t err = dr_adc_capture_echo(m_echo_buffer, num_samples); - if (err != DR_ADC_OK) return err; - - /* Analyze captured data */ - return dr_adc_analyze_echo(m_echo_buffer, num_samples, echo, 100); -} - -const uint16_t* dr_adc_get_echo_buffer(void) -{ - return m_echo_buffer; -} - -dr_adc_err_t dr_adc_analyze_echo(const uint16_t *buffer, uint16_t num_samples, - dr_adc_echo_t *echo, uint16_t threshold) -{ - if (buffer == NULL || echo == NULL) return DR_ADC_ERR_INVALID_PARAM; - if (num_samples == 0) return DR_ADC_ERR_INVALID_PARAM; - - /* Calculate baseline from first few samples */ - uint16_t baseline_samples = (num_samples > 8) ? 8 : num_samples; - echo->baseline_raw = dr_adc_calc_baseline(buffer, baseline_samples); - - /* Find peak */ - dr_adc_find_peak(buffer, num_samples, &echo->peak_raw, &echo->peak_index); - - /* Convert to voltage and time */ - echo->peak_mv = dr_adc_raw_to_mv(echo->peak_raw); - /* peak_time_us: sample_index * 0.116us (8.6MHz sample rate) */ - echo->peak_time_us = (uint32_t)((float)echo->peak_index * DR_ADC_SAMPLE_INTERVAL_US); - echo->num_samples = num_samples; - - /* Check if valid echo detected */ - if (echo->peak_raw < threshold || - echo->peak_raw <= echo->baseline_raw) - { - return DR_ADC_ERR_NO_ECHO; - } - - return DR_ADC_OK; -} - -void dr_adc_find_peak(const uint16_t *buffer, uint16_t num_samples, - uint16_t *peak_value, uint16_t *peak_index) -{ - /* - * Posterior wall detection for bladder measurement - * - Skip initial decay zone (index 0-29) where transducer coupling causes high values - * - Search in range [30, 70] where posterior wall echo is expected - * - Ignore values > 1500 (likely noise/saturation) - */ - #define SEARCH_START 30 - #define SEARCH_END 70 - #define MAX_VALID_VALUE 1500 /* Values above this are likely noise */ - - uint16_t max_val = 0; - uint16_t max_idx = 0; - - uint16_t start = (num_samples > SEARCH_START) ? SEARCH_START : 0; - uint16_t end = (num_samples > SEARCH_END) ? SEARCH_END : num_samples; - - for (uint16_t i = start; i < end; i++) - { - uint16_t val = buffer[i]; - /* Skip abnormally high values (noise/saturation) */ - if (val > MAX_VALID_VALUE) continue; - - if (val > max_val) - { - max_val = val; - max_idx = i; - } - } - - if (peak_value != NULL) *peak_value = max_val; - if (peak_index != NULL) *peak_index = max_idx; -} - -uint16_t dr_adc_calc_baseline(const uint16_t *buffer, uint16_t num_samples) -{ - if (buffer == NULL || num_samples == 0) return 0; - - uint32_t sum = 0; - for (uint16_t i = 0; i < num_samples; i++) - { - sum += buffer[i]; - } - - return (uint16_t)(sum / num_samples); -} - -/*============================================================================== - * PUBLIC FUNCTIONS - UTILITY - *============================================================================*/ - -uint32_t dr_adc_raw_to_mv(uint16_t raw_value) -{ - /* V_mv = (raw * VREF_mv) / 4096 */ - return ((uint32_t)raw_value * m_vref_mv) / (DR_ADC_MAX_VALUE + 1); -} - -void dr_adc_set_vref(uint32_t vref_mv) -{ - m_vref_mv = vref_mv; - ADC_LOG("VREF set to %d mV", vref_mv); -} - -uint32_t dr_adc_get_vref(void) -{ - return m_vref_mv; -} - -/*============================================================================== - * PUBLIC FUNCTIONS - DEBUG - *============================================================================*/ - -bool dr_adc_test(void) -{ - if (!m_initialized) - { - ADC_LOG("Test FAIL: not initialized"); - return false; - } - - uint16_t raw; - dr_adc_err_t err = dr_adc_read_raw(&raw); - - if (err != DR_ADC_OK) - { - ADC_LOG("Test FAIL: read error %d", err); - return false; - } - - if (raw > DR_ADC_MAX_VALUE) - { - ADC_LOG("Test FAIL: invalid value %d", raw); - return false; - } - - ADC_LOG("Test PASS: raw=%d (%dmV)", raw, dr_adc_raw_to_mv(raw)); - return true; -} - -void dr_adc_print_buffer(const uint16_t *buffer, uint16_t num_samples) -{ -#ifdef DEBUG_ADC - if (buffer == NULL || num_samples == 0) return; - - ADC_LOG("Echo buffer (%d samples):", num_samples); - - for (uint16_t i = 0; i < num_samples; i++) - { - ADC_LOG("[%3d] %4d (%4dmV)", i, buffer[i], dr_adc_raw_to_mv(buffer[i])); - } -#else - (void)buffer; - (void)num_samples; -#endif -} - -/*============================================================================== - * BLE TRANSMISSION - *============================================================================*/ - -/* External BLE NUS functions and variables from main.c */ -extern void binary_tx_handler(uint8_t const *ble_bin_buff, uint16_t length); -extern void dr_binary_tx_safe(uint8_t const *ble_bin_buff, uint16_t length); -extern void dr_sd_delay_ms(uint32_t ms); - -/*============================================================================== - * INTEGRATED BURST + CAPTURE + TRANSMIT - *============================================================================*/ - -/* External piezo burst function */ -extern void dr_piezo_burst_sw(uint8_t cycles); - -/* BLE packet constants */ -#define BLE_MTU_SIZE 240 -#define BLE_FIRST_HEADER_LEN 14 /* "rec:" + header */ -#define BLE_CONT_HEADER_LEN 6 /* "red:" + packet_index */ -#define BLE_FIRST_DATA_LEN (BLE_MTU_SIZE - BLE_FIRST_HEADER_LEN) -#define BLE_CONT_DATA_LEN (BLE_MTU_SIZE - BLE_CONT_HEADER_LEN) -#define BLE_PACKET_DELAY_MS 100 /* Inter-packet delay - allow BLE TX buffer to drain */ -#define BLE_FIRST_PACKET_DELAY 5 /* Minimal delay */ - -/* Protocol version markers (OR'd with packet count in reb: header) */ -#define MEC_VERSION_MARKER 0xD000 /* vD: raa only (no ree) - ree causes packet loss */ -#define MAA_VERSION_MARKER 0xF000 /* vF: maa? hardcoded 8-channel debug */ - -/*============================================================================== - * PIEZO CHANNEL SELECTION - implemented in dr_piezo.c - *============================================================================*/ -extern void dr_piezo_select_channel(uint8_t channel); - -/*============================================================================== - * INTEGRATED BURST + CAPTURE + TRANSMIT - *============================================================================*/ - -/** - * @brief Integrated burst + capture + BLE transmit (16-bit raw data) - * - * PROTOCOL v3: Small header packet + separate data packets with delays - * (Large first packets were being dropped by BLE stack) - * - * Response format: - * Packet 1 (reb:): header only (14 bytes) - * Packet 2~N (red:): pkt_idx(2) + raw_data(up to 234 bytes = 117 samples) - * Final (ree:): total_packets(2) - * - * With 140 samples: 280 bytes = reb:(14) + red:(6+234) + red:(6+46) + ree:(6) - */ -dr_adc_err_t dr_adc_burst_capture_transmit(uint8_t freq_option, uint16_t delay_us, - uint16_t num_samples, uint8_t cycles, - uint16_t averaging, uint8_t piezo_ch, - uint8_t *ble_buffer, uint8_t skip_raa) -{ - if (ble_buffer == NULL) return DR_ADC_ERR_INVALID_PARAM; - if (num_samples == 0 || num_samples > DR_ADC_ECHO_SAMPLES_MAX) - return DR_ADC_ERR_INVALID_PARAM; - if (freq_option > 3) freq_option = 0; /* Invalid -> default 1.8MHz */ - if (cycles < 3 || cycles > 9) cycles = 5; /* Valid range: 3~9, default 5 */ - if (averaging == 0) averaging = 1; /* Minimum 1 */ - if (averaging > 1000) averaging = 1000; /* Maximum 1000 */ - if (piezo_ch > 7) piezo_ch = 0; /* Validate piezo channel: 0~7 jhChun 26.01.29 */ - - dr_adc_echo_t echo; - echo.peak_raw = 0; - echo.peak_mv = 0; - echo.peak_index = 0; - echo.peak_time_us = 0; - echo.baseline_raw = 0; - echo.num_samples = 0; - - /* Accumulator buffer for averaging (32-bit to prevent overflow) */ - static uint32_t accum_buffer[DR_ADC_ECHO_SAMPLES_MAX]; - - /* CRITICAL: Clear entire accumulator buffer at start of each mec call */ - memset(accum_buffer, 0, sizeof(accum_buffer)); - - if (!m_initialized) - { - dr_adc_err_t init_err = dr_adc_init(); - if (init_err != DR_ADC_OK) return init_err; - } - - /* Settling time for ADC power */ - nrf_delay_us(100); - - /*--- Step 2: Select piezo channel ---*/ - dr_piezo_select_channel(piezo_ch); - - /*--- Step 3~5: Burst + Delay + Capture ---*/ - if (averaging == 1) { - /*=== SINGLE MEASUREMENT (no averaging) - direct path ===*/ - - /* Execute piezo burst based on frequency option */ - switch (freq_option) { - case 0: - default: - dr_piezo_burst_sw_18mhz(cycles); /* 1.8MHz (default) */ - break; - case 1: - dr_piezo_burst_sw(cycles); /* 2.1MHz */ - break; - case 2: - dr_piezo_burst_sw_20mhz(cycles); /* 2.0MHz */ - break; - case 3: - dr_piezo_burst_sw_17mhz(cycles); /* 1.7MHz */ - break; - } - - /* Delay before capture (configurable, default 20us) */ - if (delay_us > 0) { - nrf_delay_us(delay_us); - } - - /* Capture ADC samples directly to m_echo_buffer */ - dr_adc_err_t err = dr_adc_capture_echo(m_echo_buffer, num_samples); - if (err != DR_ADC_OK) return err; - - ADC_LOG("mec: single measurement (no averaging)"); - } - else { - /*=== MULTIPLE MEASUREMENTS (with averaging) ===*/ - /* Note: accum_buffer already cleared by memset at function start */ - - for (uint16_t avg_iter = 0; avg_iter < averaging; avg_iter++) { - /* Wait for previous echo to decay before next measurement - * 1ms = ~77cm round-trip decay time (sound speed 1.54mm/us) - * Skip delay on first iteration */ - if (avg_iter > 0) { - nrf_delay_us(500); /* 500us between measurements */ - } - - /* Re-select piezo channel before each burst - * (burst functions may modify P1 port state) */ - dr_piezo_select_channel(piezo_ch); - - /* Execute piezo burst based on frequency option */ - switch (freq_option) { - case 0: - default: - dr_piezo_burst_sw_18mhz(cycles); /* 1.8MHz (default) */ - break; - case 1: - dr_piezo_burst_sw(cycles); /* 2.1MHz */ - break; - case 2: - dr_piezo_burst_sw_20mhz(cycles); /* 2.0MHz */ - break; - case 3: - dr_piezo_burst_sw_17mhz(cycles); /* 1.7MHz */ - break; - } - - /* Delay before capture (configurable, default 20us) */ - if (delay_us > 0) { - nrf_delay_us(delay_us); - } - - /* Capture ADC samples */ - dr_adc_err_t err = dr_adc_capture_echo(m_echo_buffer, num_samples); - if (err != DR_ADC_OK) return err; - - /* Accumulate samples */ - for (uint16_t i = 0; i < num_samples; i++) { - accum_buffer[i] += m_echo_buffer[i]; - } - } - - /* Calculate average and store back to m_echo_buffer */ - for (uint16_t i = 0; i < num_samples; i++) { - m_echo_buffer[i] = (uint16_t)(accum_buffer[i] / averaging); - } - - ADC_LOG("mec: averaged %u measurements", averaging); - } - - /*--- Step 6: Analyze averaged data ---*/ - dr_adc_analyze_echo(m_echo_buffer, num_samples, &echo, 100); - - /*--- Step 6: Transmit via BLE - PROTOCOL v3 ---*/ - /* Packet 1: reb:(4) + header(10) = 14 bytes ONLY (no data) */ - /* Packet 2~N: red:(4) + pkt_idx(2) + data(up to 234 bytes) */ - /* Final: ree:(4) + total_pkts(2) = 6 bytes */ - - uint16_t total_data_bytes = echo.num_samples * 2; - uint16_t cont_pkt_data_cap = BLE_MTU_SIZE - BLE_CONT_HEADER_LEN; /* 234 bytes */ - - /* Calculate total data packets needed (header packet doesn't carry data) */ - uint16_t data_packets = (total_data_bytes + cont_pkt_data_cap - 1) / cont_pkt_data_cap; - uint16_t total_packets = 1 + data_packets; /* header + data packets */ - - /* Version marker: select based on skip_raa (0=mec, 1=maa) */ - uint16_t version_marker = skip_raa ? MAA_VERSION_MARKER : MEC_VERSION_MARKER; - uint16_t pkts_with_ver = total_packets | version_marker; - - ADC_LOG("mec v6: samples=%u data=%u bytes, packets=%u", echo.num_samples, total_data_bytes, total_packets); - - /* Packet 1: reb: header ONLY (14 bytes) - small packet won't be dropped */ - ble_buffer[0] = 'r'; - ble_buffer[1] = 'e'; - ble_buffer[2] = 'b'; - ble_buffer[3] = ':'; - ble_buffer[4] = (uint8_t)(pkts_with_ver & 0xFF); - ble_buffer[5] = (uint8_t)(pkts_with_ver >> 8); - ble_buffer[6] = (uint8_t)(echo.peak_raw & 0xFF); - ble_buffer[7] = (uint8_t)(echo.peak_raw >> 8); - ble_buffer[8] = (uint8_t)(echo.peak_index & 0xFF); - ble_buffer[9] = (uint8_t)(echo.peak_index >> 8); - ble_buffer[10] = (uint8_t)(echo.baseline_raw & 0xFF); - ble_buffer[11] = (uint8_t)(echo.baseline_raw >> 8); - ble_buffer[12] = (uint8_t)(echo.num_samples & 0xFF); - ble_buffer[13] = (uint8_t)(echo.num_samples >> 8); - - dr_binary_tx_safe(ble_buffer, 7); /* Send header only: 14 bytes = 7 words */ - dr_sd_delay_ms(BLE_PACKET_DELAY_MS); /* Wait for BLE stack */ - - /* Data packets (red:) - starting from pkt index 0 */ - uint16_t src_idx = 0; - for (uint16_t pkt = 0; pkt < data_packets; pkt++) { - ble_buffer[0] = 'r'; - ble_buffer[1] = 'e'; - ble_buffer[2] = 'd'; - ble_buffer[3] = ':'; - ble_buffer[4] = (uint8_t)(pkt & 0xFF); - ble_buffer[5] = (uint8_t)(pkt >> 8); - - uint16_t dst_idx = 6; - uint16_t bytes_this_pkt = 0; - while (src_idx < echo.num_samples && bytes_this_pkt < cont_pkt_data_cap) { - uint16_t sample = m_echo_buffer[src_idx++] & 0x0FFF; - ble_buffer[dst_idx++] = (uint8_t)(sample & 0xFF); - ble_buffer[dst_idx++] = (uint8_t)(sample >> 8); - bytes_this_pkt += 2; - } - - dr_binary_tx_safe(ble_buffer, dst_idx / 2); /* bytes to words */ - dr_sd_delay_ms(BLE_PACKET_DELAY_MS); /* Inter-packet delay */ - } - - /* vD: Send raa: only - ree: causes subsequent packet loss */ - /* DrBench now saves channel data when receiving raa: */ - /* skip_raa: 0=send raa (mec), 1=skip raa (maa - caller sends final raa) */ - if (!skip_raa) { - ble_buffer[0] = 'r'; - ble_buffer[1] = 'a'; - ble_buffer[2] = 'a'; - ble_buffer[3] = ':'; - ble_buffer[4] = 0x00; - ble_buffer[5] = 0x00; - dr_binary_tx_safe(ble_buffer, 3); /* 6 bytes = 3 words */ - } - - ADC_LOG("mec v6: complete - reb + red*%u + skip_raa=%u (%u samples)", data_packets, skip_raa, echo.num_samples); - - return DR_ADC_OK; -} - - -/*============================================================================== - * 4-CHANNEL CAPTURE FUNCTIONS (maa? command support) - *============================================================================*/ - -dr_adc_err_t dr_adc_capture_channel_only(uint8_t freq_option, uint16_t delay_us, - uint16_t num_samples, uint8_t cycles, - uint16_t averaging, uint8_t piezo_ch, - dr_maa_channel_t *out_channel) -{ - if (out_channel == NULL) return DR_ADC_ERR_INVALID_PARAM; - if (num_samples == 0 || num_samples > MAA_SAMPLES_MAX) - return DR_ADC_ERR_INVALID_PARAM; - if (freq_option > 3) freq_option = 0; - if (cycles < 3 || cycles > 9) cycles = 5; - if (averaging == 0) averaging = 1; - if (averaging > 1000) averaging = 1000; - if (piezo_ch > (MAA_NUM_CHANNELS - 1)) piezo_ch = 0; - - /* Accumulator buffer for averaging */ - static uint32_t accum_buffer[MAA_SAMPLES_MAX]; - memset(accum_buffer, 0, num_samples * sizeof(uint32_t)); - - if (!m_initialized) { - dr_adc_err_t init_err = dr_adc_init(); - if (init_err != DR_ADC_OK) return init_err; - } - nrf_delay_us(100); - - /* Select piezo channel */ - dr_piezo_select_channel(piezo_ch); - - /* Capture with averaging */ - for (uint16_t avg_iter = 0; avg_iter < averaging; avg_iter++) { - if (avg_iter > 0) { - nrf_delay_us(500); /* Echo decay time */ - } - - dr_piezo_select_channel(piezo_ch); - - /* Execute piezo burst */ - switch (freq_option) { - case 0: - default: - dr_piezo_burst_sw_18mhz(cycles); - break; - case 1: - dr_piezo_burst_sw(cycles); - break; - case 2: - dr_piezo_burst_sw_20mhz(cycles); - break; - case 3: - dr_piezo_burst_sw_17mhz(cycles); - break; - } - - if (delay_us > 0) { - nrf_delay_us(delay_us); - } - - /* Capture to internal buffer */ - dr_adc_err_t err = dr_adc_capture_echo(m_echo_buffer, num_samples); - if (err != DR_ADC_OK) return err; - - /* Accumulate */ - for (uint16_t i = 0; i < num_samples; i++) { - accum_buffer[i] += m_echo_buffer[i]; - } - } - - /* Calculate average and copy to output */ - for (uint16_t i = 0; i < num_samples; i++) { - out_channel->samples[i] = (uint16_t)(accum_buffer[i] / averaging); - } - out_channel->num_samples = num_samples; - - /* Analyze echo data */ - dr_adc_echo_t echo; - dr_adc_analyze_echo(out_channel->samples, num_samples, &echo, 100); - out_channel->peak_raw = echo.peak_raw; - out_channel->peak_index = echo.peak_index; - out_channel->baseline_raw = echo.baseline_raw; - - ADC_LOG("maa capture CH%u: peak=%u idx=%u baseline=%u", - piezo_ch, out_channel->peak_raw, out_channel->peak_index, out_channel->baseline_raw); - - return DR_ADC_OK; -} - - -dr_adc_err_t dr_adc_transmit_channel(const dr_maa_channel_t *ch_data, - uint8_t *ble_buffer) -{ - /* Debug BEFORE null check to see if we even enter the function */ - dr_ble_debug(0x00FF, 0xAAAA); /* Function called marker */ - - if (ch_data == NULL || ble_buffer == NULL) { - dr_ble_debug(0x00FE, (ch_data == NULL ? 0x0001 : 0) | (ble_buffer == NULL ? 0x0002 : 0)); - return DR_ADC_ERR_INVALID_PARAM; - } - - dr_ble_debug(0x0100, ch_data->num_samples); /* Function entry - params valid */ - - uint16_t total_data_bytes = ch_data->num_samples * 2; - uint16_t cont_pkt_data_cap = BLE_MTU_SIZE - BLE_CONT_HEADER_LEN; /* 234 bytes */ - uint16_t data_packets = (total_data_bytes + cont_pkt_data_cap - 1) / cont_pkt_data_cap; - uint16_t total_packets = 1 + data_packets; - - /* Version marker: MAA_VERSION_MARKER | total_packets */ - uint16_t pkt_with_ver = total_packets | MAA_VERSION_MARKER; - - dr_ble_debug(0x0101, total_packets); /* Before reb: */ - - /* Packet 1: reb: header (14 bytes) */ - ble_buffer[0] = 'r'; - ble_buffer[1] = 'e'; - ble_buffer[2] = 'b'; - ble_buffer[3] = ':'; - ble_buffer[4] = (uint8_t)(pkt_with_ver & 0xFF); - ble_buffer[5] = (uint8_t)(pkt_with_ver >> 8); - ble_buffer[6] = (uint8_t)(ch_data->peak_raw & 0xFF); - ble_buffer[7] = (uint8_t)(ch_data->peak_raw >> 8); - ble_buffer[8] = (uint8_t)(ch_data->peak_index & 0xFF); - ble_buffer[9] = (uint8_t)(ch_data->peak_index >> 8); - ble_buffer[10] = (uint8_t)(ch_data->baseline_raw & 0xFF); - ble_buffer[11] = (uint8_t)(ch_data->baseline_raw >> 8); - ble_buffer[12] = (uint8_t)(ch_data->num_samples & 0xFF); - ble_buffer[13] = (uint8_t)(ch_data->num_samples >> 8); - - /* Send reb: header */ - /* Use dr_binary_tx_safe like mec? does, with dr_sd_delay_ms for SoftDevice */ - dr_binary_tx_safe(ble_buffer, 7); - dr_sd_delay_ms(BLE_PACKET_DELAY_MS); - - dr_ble_debug(0x0102, data_packets); /* After reb: */ - - /* Data packets (red:) */ - uint16_t src_idx = 0; - for (uint16_t pkt = 0; pkt < data_packets; pkt++) { - ble_buffer[0] = 'r'; - ble_buffer[1] = 'e'; - ble_buffer[2] = 'd'; - ble_buffer[3] = ':'; - ble_buffer[4] = (uint8_t)(pkt & 0xFF); - ble_buffer[5] = (uint8_t)(pkt >> 8); - - uint16_t dst_idx = 6; - uint16_t bytes_this_pkt = 0; - while (src_idx < ch_data->num_samples && bytes_this_pkt < cont_pkt_data_cap) { - uint16_t sample = ch_data->samples[src_idx++] & 0x0FFF; - ble_buffer[dst_idx++] = (uint8_t)(sample & 0xFF); - ble_buffer[dst_idx++] = (uint8_t)(sample >> 8); - bytes_this_pkt += 2; - } - - dr_binary_tx_safe(ble_buffer, dst_idx / 2); - dr_sd_delay_ms(BLE_PACKET_DELAY_MS); - - dr_ble_debug(0x0103, pkt); /* red: packet sent */ - } - - dr_ble_debug(0x0104, 0); /* Before ree: */ - - /* Final packet: ree: */ - ble_buffer[0] = 'r'; - ble_buffer[1] = 'e'; - ble_buffer[2] = 'e'; - ble_buffer[3] = ':'; - ble_buffer[4] = (uint8_t)(total_packets & 0xFF); - ble_buffer[5] = (uint8_t)(total_packets >> 8); - dr_binary_tx_safe(ble_buffer, 3); - - dr_ble_debug(0x010F, 0); /* Function complete */ - - return DR_ADC_OK; -} - - -/*============================================================================== - * DELTA COMPRESSION FUNCTIONS - *============================================================================*/ - -dr_adc_err_t dr_adc_delta_compress(const uint16_t *samples, uint16_t num_samples, - uint8_t *out_buffer, uint16_t *out_size) -{ - if (samples == NULL || out_buffer == NULL || out_size == NULL) - return DR_ADC_ERR_INVALID_PARAM; - if (num_samples == 0) { - *out_size = 0; - return DR_ADC_OK; - } - - uint16_t idx = 0; - - /* First sample: 16-bit raw value */ - out_buffer[idx++] = (uint8_t)(samples[0] & 0xFF); - out_buffer[idx++] = (uint8_t)(samples[0] >> 8); - - /* Delta encode remaining samples */ - for (uint16_t i = 1; i < num_samples; i++) { - int16_t delta = (int16_t)samples[i] - (int16_t)samples[i-1]; - - if (delta >= -127 && delta <= 127) { - /* Normal delta: fits in signed 8-bit */ - out_buffer[idx++] = (int8_t)delta; - } else { - /* Out of range: escape + 16-bit raw value */ - out_buffer[idx++] = DELTA_ESCAPE_BYTE; - out_buffer[idx++] = (uint8_t)(samples[i] & 0xFF); - out_buffer[idx++] = (uint8_t)(samples[i] >> 8); - } - } - - *out_size = idx; - return DR_ADC_OK; -} - - -dr_adc_err_t dr_adc_transmit_channel_delta(const dr_maa_channel_t *ch_data, - uint8_t *ble_buffer) -{ - if (ch_data == NULL || ble_buffer == NULL) return DR_ADC_ERR_INVALID_PARAM; - - /* Compress data first */ - static uint8_t delta_buffer[400]; /* Worst case: 140*3 = 420 bytes */ - uint16_t compressed_size = 0; - - dr_adc_err_t err = dr_adc_delta_compress(ch_data->samples, ch_data->num_samples, - delta_buffer, &compressed_size); - if (err != DR_ADC_OK) return err; - - ADC_LOG("maa delta: %u samples -> %u bytes (%.0f%%)", - ch_data->num_samples, compressed_size, - 100.0f * compressed_size / (ch_data->num_samples * 2)); - - uint16_t cont_pkt_data_cap = BLE_MTU_SIZE - BLE_CONT_HEADER_LEN; /* 234 bytes */ - uint16_t data_packets = (compressed_size + cont_pkt_data_cap - 1) / cont_pkt_data_cap; - uint16_t total_packets = 1 + data_packets; - - /* Version marker for delta mode: 0xC000 | total_packets */ - uint16_t pkt_with_ver = total_packets | 0xC000; /* v2 delta marker */ - - /* Packet 1: rdb: header (16 bytes) - includes compressed_size */ - ble_buffer[0] = 'r'; - ble_buffer[1] = 'd'; - ble_buffer[2] = 'b'; - ble_buffer[3] = ':'; - ble_buffer[4] = (uint8_t)(pkt_with_ver & 0xFF); - ble_buffer[5] = (uint8_t)(pkt_with_ver >> 8); - ble_buffer[6] = (uint8_t)(ch_data->peak_raw & 0xFF); - ble_buffer[7] = (uint8_t)(ch_data->peak_raw >> 8); - ble_buffer[8] = (uint8_t)(ch_data->peak_index & 0xFF); - ble_buffer[9] = (uint8_t)(ch_data->peak_index >> 8); - ble_buffer[10] = (uint8_t)(ch_data->baseline_raw & 0xFF); - ble_buffer[11] = (uint8_t)(ch_data->baseline_raw >> 8); - ble_buffer[12] = (uint8_t)(ch_data->num_samples & 0xFF); - ble_buffer[13] = (uint8_t)(ch_data->num_samples >> 8); - ble_buffer[14] = (uint8_t)(compressed_size & 0xFF); - ble_buffer[15] = (uint8_t)(compressed_size >> 8); - - dr_binary_tx_safe(ble_buffer, 8); /* 16 bytes = 8 words */ - dr_sd_delay_ms(BLE_PACKET_DELAY_MS); - - /* Data packets (rdd:) */ - uint16_t src_idx = 0; - for (uint16_t pkt = 0; pkt < data_packets; pkt++) { - ble_buffer[0] = 'r'; - ble_buffer[1] = 'd'; - ble_buffer[2] = 'd'; - ble_buffer[3] = ':'; - ble_buffer[4] = (uint8_t)(pkt & 0xFF); - ble_buffer[5] = (uint8_t)(pkt >> 8); - - uint16_t dst_idx = 6; - uint16_t bytes_this_pkt = 0; - while (src_idx < compressed_size && bytes_this_pkt < cont_pkt_data_cap) { - ble_buffer[dst_idx++] = delta_buffer[src_idx++]; - bytes_this_pkt++; - } - - /* Pad to word boundary if needed */ - if (dst_idx & 1) { - ble_buffer[dst_idx++] = 0; - } - - dr_binary_tx_safe(ble_buffer, dst_idx / 2); - dr_sd_delay_ms(BLE_PACKET_DELAY_MS); - } - - /* Final packet: rde: */ - ble_buffer[0] = 'r'; - ble_buffer[1] = 'd'; - ble_buffer[2] = 'e'; - ble_buffer[3] = ':'; - ble_buffer[4] = (uint8_t)(total_packets & 0xFF); - ble_buffer[5] = (uint8_t)(total_packets >> 8); - dr_binary_tx_safe(ble_buffer, 3); - dr_sd_delay_ms(BLE_PACKET_DELAY_MS); - - return DR_ADC_OK; -} - - -/*============================================================================== - * ASYNC MAA - Non-blocking 8-channel capture - * - * State machine driven by BLE TX complete events (BLE_NUS_EVT_TX_RDY) - * This prevents blocking the main loop and allows SoftDevice to process events. - *============================================================================*/ - -/* Global async context */ -static maa_async_ctx_t g_maa_ctx = { .state = MAA_ASYNC_IDLE }; - -/* Version marker for async MAA */ -#define MAA_ASYNC_VERSION_MARKER 0xC000 /* vC: async 8-channel + raa delay fix + cleanup */ - -/** - * @brief Capture one channel (internal helper) - */ -static dr_adc_err_t maa_async_capture_channel(uint8_t ch) -{ - if (ch > (MAA_NUM_CHANNELS - 1)) return DR_ADC_ERR_INVALID_PARAM; - - return dr_adc_capture_channel_only( - g_maa_ctx.freq_option, - g_maa_ctx.delay_us, - g_maa_ctx.num_samples, - g_maa_ctx.cycles, - g_maa_ctx.averaging, - ch, - &g_maa_ctx.channels[ch] - ); -} - -/** - * @brief Send reb: header for current channel - */ -static void maa_async_send_header(void) -{ - dr_maa_channel_t *ch = &g_maa_ctx.channels[g_maa_ctx.current_ch]; - uint8_t *buf = g_maa_ctx.ble_buffer; - - uint16_t total_data_bytes = ch->num_samples * 2; - uint16_t cont_pkt_data_cap = BLE_MTU_SIZE - BLE_CONT_HEADER_LEN; - g_maa_ctx.data_packets = (total_data_bytes + cont_pkt_data_cap - 1) / cont_pkt_data_cap; - g_maa_ctx.total_packets = 1 + g_maa_ctx.data_packets; - - uint16_t pkts_with_ver = g_maa_ctx.total_packets | MAA_ASYNC_VERSION_MARKER; - - /* reb: header (14 bytes) */ - buf[0] = 'r'; buf[1] = 'e'; buf[2] = 'b'; buf[3] = ':'; - buf[4] = (uint8_t)(pkts_with_ver & 0xFF); - buf[5] = (uint8_t)(pkts_with_ver >> 8); - buf[6] = (uint8_t)(ch->peak_raw & 0xFF); - buf[7] = (uint8_t)(ch->peak_raw >> 8); - buf[8] = (uint8_t)(ch->peak_index & 0xFF); - buf[9] = (uint8_t)(ch->peak_index >> 8); - buf[10] = (uint8_t)(ch->baseline_raw & 0xFF); - buf[11] = (uint8_t)(ch->baseline_raw >> 8); - buf[12] = (uint8_t)(ch->num_samples & 0xFF); - buf[13] = (uint8_t)(ch->num_samples >> 8); - - dr_binary_tx_safe(buf, 7); /* 14 bytes = 7 words */ - dr_sd_delay_ms(50); /* Allow BLE stack to process TX */ - - g_maa_ctx.current_pkt = 0; - g_maa_ctx.data_offset = 0; - g_maa_ctx.state = MAA_ASYNC_TX_DATA; - - ADC_LOG("maa_async: CH%u reb: sent (pkts=%u)", g_maa_ctx.current_ch, g_maa_ctx.total_packets); -} - -/** - * @brief Send next red: data packet - * @return true if more packets to send, false if done with current channel - */ -static bool maa_async_send_data_packet(void) -{ - dr_maa_channel_t *ch = &g_maa_ctx.channels[g_maa_ctx.current_ch]; - uint8_t *buf = g_maa_ctx.ble_buffer; - - uint16_t total_data_bytes = ch->num_samples * 2; - if (g_maa_ctx.data_offset >= total_data_bytes) { - return false; /* All data sent */ - } - - uint16_t pkt_idx = g_maa_ctx.current_pkt; - uint16_t remaining = total_data_bytes - g_maa_ctx.data_offset; - uint16_t chunk_size = (remaining > BLE_CONT_DATA_LEN) ? BLE_CONT_DATA_LEN : remaining; - - /* red: packet header */ - buf[0] = 'r'; buf[1] = 'e'; buf[2] = 'd'; buf[3] = ':'; - buf[4] = (uint8_t)(pkt_idx & 0xFF); - buf[5] = (uint8_t)(pkt_idx >> 8); - - /* Copy sample data */ - uint16_t src_sample_idx = g_maa_ctx.data_offset / 2; - uint16_t dst_idx = 6; - for (uint16_t i = 0; i < chunk_size / 2 && src_sample_idx < ch->num_samples; i++, src_sample_idx++) { - uint16_t sample = ch->samples[src_sample_idx]; - buf[dst_idx++] = (uint8_t)(sample & 0xFF); - buf[dst_idx++] = (uint8_t)(sample >> 8); - } - - dr_binary_tx_safe(buf, dst_idx / 2); - dr_sd_delay_ms(50); /* Allow BLE stack to process TX */ - - g_maa_ctx.data_offset += chunk_size; - g_maa_ctx.current_pkt++; - - ADC_LOG("maa_async: CH%u red:%u (%u/%u bytes)", - g_maa_ctx.current_ch, pkt_idx, g_maa_ctx.data_offset, total_data_bytes); - - return (g_maa_ctx.data_offset < total_data_bytes); -} - -/** - * @brief Send raa: completion marker - */ -static void maa_async_send_completion(uint16_t status) -{ - uint8_t *buf = g_maa_ctx.ble_buffer; - - /* Wait for previous TX to complete before sending raa: */ - dr_sd_delay_ms(50); - - buf[0] = 'r'; buf[1] = 'a'; buf[2] = 'a'; buf[3] = ':'; - buf[4] = (uint8_t)(status & 0xFF); - buf[5] = (uint8_t)(status >> 8); - - dr_binary_tx_safe(buf, 3); - - g_maa_ctx.state = MAA_ASYNC_IDLE; - ADC_LOG("maa_async: complete, status=0x%04X", status); -} - -/*============================================================================== - * PUBLIC ASYNC API - *============================================================================*/ - -dr_adc_err_t maa_async_start(uint8_t freq_option, uint16_t delay_us, - uint16_t num_samples, uint8_t cycles, - uint16_t averaging, uint8_t *ble_buffer) -{ - if (g_maa_ctx.state != MAA_ASYNC_IDLE) { - ADC_LOG("maa_async_start: busy"); - return DR_ADC_ERR_NOT_INIT; /* Already running */ - } - - if (ble_buffer == NULL) return DR_ADC_ERR_INVALID_PARAM; - if (num_samples == 0 || num_samples > DR_ADC_ECHO_SAMPLES_MAX) - return DR_ADC_ERR_INVALID_PARAM; - - /* Initialize context */ - g_maa_ctx.freq_option = freq_option; - g_maa_ctx.delay_us = delay_us; - g_maa_ctx.num_samples = num_samples; - g_maa_ctx.cycles = (cycles < 3 || cycles > 9) ? 5 : cycles; - g_maa_ctx.averaging = (averaging == 0) ? 1 : ((averaging > 1000) ? 1000 : averaging); - g_maa_ctx.ble_buffer = ble_buffer; - g_maa_ctx.current_ch = 0; - g_maa_ctx.current_pkt = 0; - g_maa_ctx.data_offset = 0; - - ADC_LOG("maa_async_start: freq=%u delay=%u samples=%u cycles=%u avg=%u", - freq_option, delay_us, num_samples, g_maa_ctx.cycles, g_maa_ctx.averaging); - - /* Capture CH0 */ - g_maa_ctx.state = MAA_ASYNC_CAPTURING; - dr_adc_err_t err = maa_async_capture_channel(0); - if (err != DR_ADC_OK) { - ADC_LOG("maa_async_start: CH0 capture failed (%d)", err); - maa_async_send_completion(0xFFF0); - return err; - } - - /* Send CH0 header - this will trigger TX_RDY for subsequent packets */ - maa_async_send_header(); - - return DR_ADC_OK; -} - -bool maa_async_on_tx_ready(void) -{ - if (g_maa_ctx.state == MAA_ASYNC_IDLE) { - return false; - } - - switch (g_maa_ctx.state) { - case MAA_ASYNC_TX_DATA: - /* Send next data packet */ - if (!maa_async_send_data_packet()) { - /* Current channel done, move to next */ - g_maa_ctx.current_ch++; - if (g_maa_ctx.current_ch >= MAA_NUM_CHANNELS) { - /* All channels done */ - g_maa_ctx.state = MAA_ASYNC_COMPLETE; - maa_async_send_completion(0x0000); - return false; - } else { - /* Capture next channel */ - g_maa_ctx.state = MAA_ASYNC_CAPTURING; - dr_adc_err_t err = maa_async_capture_channel(g_maa_ctx.current_ch); - if (err != DR_ADC_OK) { - ADC_LOG("maa_async: CH%u capture failed", g_maa_ctx.current_ch); - maa_async_send_completion(0xFFF0 | g_maa_ctx.current_ch); - return false; - } - /* Send header for new channel */ - maa_async_send_header(); - } - } - return true; - - case MAA_ASYNC_TX_HEADER: - /* Header sent, start sending data */ - g_maa_ctx.state = MAA_ASYNC_TX_DATA; - maa_async_send_data_packet(); - return true; - - case MAA_ASYNC_CAPTURING: - /* Shouldn't happen - capture is synchronous */ - return true; - - case MAA_ASYNC_COMPLETE: - case MAA_ASYNC_IDLE: - default: - return false; - } -} - -bool maa_async_is_busy(void) -{ - return (g_maa_ctx.state != MAA_ASYNC_IDLE); -} - -maa_async_state_t maa_async_get_state(void) -{ - return g_maa_ctx.state; -} - -void maa_async_abort(void) -{ - if (g_maa_ctx.state != MAA_ASYNC_IDLE) { - ADC_LOG("maa_async_abort: aborting from state %d", g_maa_ctx.state); - g_maa_ctx.state = MAA_ASYNC_IDLE; - } -} - diff --git a/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_adc121s051.h b/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_adc121s051.h deleted file mode 100644 index f4edec9..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_adc121s051.h +++ /dev/null @@ -1,505 +0,0 @@ -/******************************************************************************* - * @file dr_adc121s051.h - * @brief ADC121S051 12-bit ADC Driver for nRF52840 - * For 1.2MHz Piezo Echo Envelope Detection - * @author Charles KWON - * @date 2025-12-15 - * - * @details This driver reads the envelope-detected DC level from piezo echo. - * - * Signal Flow: - * - * [Piezo TX] [Echo RX] [Envelope] [ADC] [MCU] - * 1.2MHz --> Reflect --> Detector --> DC Level --> Digital - * burst signal (hardware) reading value - * - * The envelope detector circuit converts the 1.2MHz echo burst - * into a DC voltage proportional to the echo amplitude. - * ADC samples this DC level for amplitude measurement. - * - * @note Hardware: Texas Instruments ADC121S051 - * - 12-bit resolution (0-4095) - * - Sample rate: 200-500 ksps - * - Input range: 0V to VA - * - SPI interface (software bit-bang) - ******************************************************************************/ - -#ifndef DR_ADC121S051_H -#define DR_ADC121S051_H - -#include -#include -#include "nrf_gpio.h" - -/*============================================================================== - * PIN CONFIGURATION - * - * WARNING: Never hardcode pin numbers! - * Hardcoding may save a developer's time momentarily, - * but it will also shorten their lifespan. - *============================================================================*/ -#define DR_ADC_PIN_SCLK NRF_GPIO_PIN_MAP(0, 14) /**< Serial Clock */ -#define DR_ADC_PIN_SDATA NRF_GPIO_PIN_MAP(0, 15) /**< Serial Data (MISO) */ -#define DR_ADC_PIN_CS NRF_GPIO_PIN_MAP(0, 19) /**< Chip Select P0.13 -> P0.19 */ - -/*============================================================================== - * ADC SPECIFICATIONS - *============================================================================*/ -#define DR_ADC_RESOLUTION 12 /**< Bits */ -#define DR_ADC_MAX_VALUE 4095 /**< 2^12 - 1 */ -#define DR_ADC_VREF_MV 3300 /**< Reference voltage (mV) */ - -/*============================================================================== - * ECHO DETECTION CONFIGURATION - * - * Bladder Measurement Requirements: - * - Target measurement range: 20cm (200mm) - * - SCLK frequency: 8.6MHz (bit-bang SPI) - * - ADC121S051 requires 16 SCLK cycles per sample - * - Actual sample rate: 8.6MHz / 16 = 0.5375MHz = 537.5kHz - * - Actual sample interval: 16 / 8.6MHz = 1.86us - * - Sound speed in tissue: 1540m/s = 1.54mm/us - * - * Formula: samples = distance(mm) * 2 / (1.86us * 1.54mm/us) - * = distance(mm) * 2 / 2.86 - * = distance(mm) * 0.7 - * - * 10cm = 100mm -> 100 * 0.7 = 70 samples (round-trip 130us) - * 17cm = 170mm -> 170 * 0.7 = 119 samples (round-trip 221us) - * 20cm = 200mm -> 200 * 0.7 = 140 samples (round-trip 260us) - * - * Buffer size: 200 samples * 2 bytes = 400 bytes (RAM 256KB, OK) - * BLE transmission: 140 samples * 2 bytes = 280 bytes (16-bit raw, no packing) - *============================================================================*/ -#define DR_ADC_SCLK_MHZ 8.6f /**< SPI bit-bang SCLK frequency */ -#define DR_ADC_CLOCKS_PER_SAMPLE 16 /**< ADC121S051: 16 SCLK per sample */ -#define DR_ADC_ECHO_SAMPLES_MAX 200 /**< Maximum samples (20cm+ with margin) */ -#define DR_ADC_ECHO_SAMPLES_DEFAULT 140 /**< Default samples (20cm depth target) */ -#define DR_ADC_SAMPLE_INTERVAL_US 1.86f /**< 16 / 8.6MHz = 1.86us per sample */ -#define DR_ADC_SOUND_SPEED_MM_US 1.54f /**< Sound speed in tissue (mm/us) */ - -/*============================================================================== - * ERROR CODES - *============================================================================*/ -typedef enum { - DR_ADC_OK = 0, - DR_ADC_ERR_NOT_INIT, - DR_ADC_ERR_INVALID_PARAM, - DR_ADC_ERR_NO_ECHO -} dr_adc_err_t; - -/*============================================================================== - * DATA STRUCTURES - *============================================================================*/ - -/** - * @brief Single ADC reading result - */ -typedef struct { - uint16_t raw; /**< Raw 12-bit value (0-4095) */ - uint32_t voltage_mv; /**< Voltage in millivolts */ -} dr_adc_result_t; - -/** - * @brief Echo measurement result - */ -typedef struct { - uint16_t peak_raw; /**< Peak amplitude (raw) */ - uint32_t peak_mv; /**< Peak amplitude (mV) */ - uint16_t peak_index; /**< Sample index of peak */ - uint32_t peak_time_us; /**< Time to peak (us) */ - uint16_t baseline_raw; /**< Baseline level before echo */ - uint16_t num_samples; /**< Number of samples captured */ -} dr_adc_echo_t; - -/** - * @brief Echo capture configuration - */ -typedef struct { - uint16_t num_samples; /**< Samples to capture (1-200) */ - uint16_t threshold_raw; /**< Minimum peak threshold */ - uint16_t delay_us; /**< Delay before capture starts */ -} dr_adc_echo_config_t; - -/*============================================================================== - * INITIALIZATION - *============================================================================*/ - -/** - * @brief Initialize ADC driver - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_init(void); - -/** - * @brief Uninitialize ADC driver - */ -void dr_adc_uninit(void); - -/** - * @brief Check if initialized - */ -bool dr_adc_is_initialized(void); - -/*============================================================================== - * BASIC READ FUNCTIONS - *============================================================================*/ - -/** - * @brief Read single ADC value - * @param result Pointer to result structure - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_read(dr_adc_result_t *result); - -/** - * @brief Read raw 12-bit value only - * @param raw_value Pointer to store value - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_read_raw(uint16_t *raw_value); - -/** - * @brief Read averaged value - * @param result Pointer to result structure - * @param num_samples Number of samples to average (1-256) - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_read_averaged(dr_adc_result_t *result, uint16_t num_samples); - -/*============================================================================== - * ECHO DETECTION FUNCTIONS - *============================================================================*/ - -/** - * @brief Capture echo envelope after piezo burst - * @param buffer Array to store samples (must be pre-allocated) - * @param num_samples Number of samples to capture - * @return dr_adc_err_t Error code - * - * @note Call this immediately after dr_piezo_burst_sw() - */ -dr_adc_err_t dr_adc_capture_echo(uint16_t *buffer, uint16_t num_samples); - -/** - * @brief Capture and analyze echo in one call - * @param echo Pointer to echo result structure - * @param config Pointer to capture configuration (NULL for defaults) - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_measure_echo(dr_adc_echo_t *echo, const dr_adc_echo_config_t *config); - -/** - * @brief Piezo burst + Echo capture in one call - * @param cycles Number of burst cycles (3~9) - * @param delay_us Delay before capture (us) - * @param num_samples Number of samples to capture - * @param echo Pointer to echo result structure - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_burst_and_capture(uint8_t cycles, uint16_t delay_us, - uint16_t num_samples, dr_adc_echo_t *echo); - -/** - * @brief Get pointer to last captured echo buffer - * @return Pointer to internal buffer (valid until next capture) - * @note Buffer contains num_samples values from last burst_and_capture call - */ -const uint16_t* dr_adc_get_echo_buffer(void); - -/** - * @brief Analyze captured echo buffer - * @param buffer Sample buffer - * @param num_samples Number of samples in buffer - * @param echo Pointer to echo result structure - * @param threshold Minimum threshold for valid peak - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_analyze_echo(const uint16_t *buffer, uint16_t num_samples, - dr_adc_echo_t *echo, uint16_t threshold); - -/** - * @brief Find peak in buffer - * @param buffer Sample buffer - * @param num_samples Number of samples - * @param peak_value Pointer to store peak value - * @param peak_index Pointer to store peak index (can be NULL) - */ -void dr_adc_find_peak(const uint16_t *buffer, uint16_t num_samples, - uint16_t *peak_value, uint16_t *peak_index); - -/** - * @brief Calculate baseline (average of first N samples) - * @param buffer Sample buffer - * @param num_samples Number of samples to average for baseline - * @return Baseline value - */ -uint16_t dr_adc_calc_baseline(const uint16_t *buffer, uint16_t num_samples); - -/*============================================================================== - * UTILITY FUNCTIONS - *============================================================================*/ - -/** - * @brief Convert raw value to millivolts - * @param raw_value Raw 12-bit value - * @return Voltage in millivolts - */ -uint32_t dr_adc_raw_to_mv(uint16_t raw_value); - -/** - * @brief Set reference voltage - * @param vref_mv Reference voltage in millivolts - */ -void dr_adc_set_vref(uint32_t vref_mv); - -/** - * @brief Get reference voltage - * @return Reference voltage in millivolts - */ -uint32_t dr_adc_get_vref(void); - -/*============================================================================== - * DEBUG FUNCTIONS - *============================================================================*/ - -/** - * @brief Test ADC communication - * @return true if OK - */ -bool dr_adc_test(void); - -/** - * @brief Print echo buffer to debug output - * @param buffer Sample buffer - * @param num_samples Number of samples - */ -void dr_adc_print_buffer(const uint16_t *buffer, uint16_t num_samples); - -/*============================================================================== - * POWER CONTROL - *============================================================================*/ - - -/*============================================================================== - * BLE TRANSMISSION CALLBACK - *============================================================================*/ - -/*============================================================================== - * INTEGRATED BURST + CAPTURE + TRANSMIT - *============================================================================*/ - -/** - * @brief Piezo burst + ADC capture + BLE transmission (all-in-one) - * - * This function performs the complete measurement cycle internally: - * 1. Power on ADC - * 2. Select piezo channel (0~7) - * 3. Execute piezo burst (frequency based on freq_option) - * 4. Capture echo samples (after delay_us) - repeated 'averaging' times - * 5. Average the captured samples (firmware-level noise reduction) - * 6. Analyze peak/baseline - * 7. Transmit data via BLE with proper packet timing - * - * @param freq_option Frequency option: 0=1.8MHz (default), 1=2.1MHz, 2=2.0MHz, 3=1.7MHz - * @param delay_us Delay before capture (us), default 20 - * @param num_samples Number of samples to capture (1~200) - * @param cycles Number of burst cycles (3~7), default 5 - * @param averaging Number of measurements to average (1~1000), default 1 - * @param piezo_ch Piezo channel to use (0~7), default 0 - * @param ble_buffer Working buffer for BLE packets (must be >= 240 bytes) - * @return dr_adc_err_t Error code - * - * @note Must call dr_adc_register_ble_tx() before using this function - * @note BLE packets: reb: (header), red: (data), ree: (end) - * @note Higher averaging reduces noise but increases measurement time (~0.3ms per avg) - */ -dr_adc_err_t dr_adc_burst_capture_transmit(uint8_t freq_option, uint16_t delay_us, - uint16_t num_samples, uint8_t cycles, - uint16_t averaging, uint8_t piezo_ch, - uint8_t *ble_buffer, uint8_t skip_raa); - -/** - * @brief Select piezo channel (0~7) - * @param channel Piezo channel number (0~7) - * - * @note Hardware-dependent: requires MUX or individual GPIO control - * Currently uses placeholder - implement based on actual hardware - */ -void dr_piezo_select_channel(uint8_t channel); - -/*============================================================================== - * 4-CHANNEL CAPTURE (maa? command support) - *============================================================================*/ - -/** - * @brief 8-channel echo buffer for maa? command - * Memory: 140 samples × 2 bytes × 8 channels = 2,240 bytes - */ -#define MAA_NUM_CHANNELS 8 /* 4 -> 8 jhChun 26.02.12*/ -#define MAA_SAMPLES_MAX 200 - -/** - * @brief Echo data for one channel - */ -typedef struct { - uint16_t samples[MAA_SAMPLES_MAX]; /**< Raw sample data */ - uint16_t num_samples; /**< Actual sample count */ - uint16_t peak_raw; /**< Peak amplitude */ - uint16_t peak_index; /**< Peak sample index */ - uint16_t baseline_raw; /**< Baseline level */ -} dr_maa_channel_t; - -/** - * @brief Capture echo from one channel (no BLE transmission) - * - * Captures averaged echo data for a single channel and stores - * in the provided channel buffer. Does NOT transmit via BLE. - * - * @param freq_option Frequency: 0=1.8MHz, 1=2.1MHz, 2=2.0MHz, 3=1.7MHz - * @param delay_us Delay before capture (us) - * @param num_samples Number of samples (1~200) - * @param cycles Burst cycles (3~7) - * @param averaging Number of averages (1~1000) - * @param piezo_ch Piezo channel (0~7) - * @param out_channel Output channel data structure - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_capture_channel_only(uint8_t freq_option, uint16_t delay_us, - uint16_t num_samples, uint8_t cycles, - uint16_t averaging, uint8_t piezo_ch, - dr_maa_channel_t *out_channel); - -/** - * @brief Transmit captured channel data via BLE - * - * Sends previously captured channel data using reb:/red:/ree: protocol. - * - * @param ch_data Pointer to captured channel data - * @param ble_buffer Working buffer for BLE packets (>= 240 bytes) - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_transmit_channel(const dr_maa_channel_t *ch_data, - uint8_t *ble_buffer); - -/*============================================================================== - * DELTA COMPRESSION (maa? mode=1) - * - * Format: - * Byte 0-1: First sample (16-bit, little endian) - * Byte 2+: Delta values (8-bit signed) - * If delta > 127 or < -127: escape (0x80) + 16-bit value - * - * Expected compression: ~50% (280 bytes -> ~140 bytes) - *============================================================================*/ - -#define DELTA_ESCAPE_BYTE 0x80 /**< Escape marker for out-of-range delta */ - -/** - * @brief Compress sample data using delta encoding - * - * @param samples Input sample array (16-bit values) - * @param num_samples Number of samples - * @param out_buffer Output buffer for compressed data - * @param out_size Output: number of bytes written - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_delta_compress(const uint16_t *samples, uint16_t num_samples, - uint8_t *out_buffer, uint16_t *out_size); - -/** - * @brief Transmit captured channel data via BLE with delta compression - * - * Uses rdb:/rdd:/rde: protocol (delta variant of reb:/red:/ree:) - * - * @param ch_data Pointer to captured channel data - * @param ble_buffer Working buffer for BLE packets (>= 240 bytes) - * @return dr_adc_err_t Error code - */ -dr_adc_err_t dr_adc_transmit_channel_delta(const dr_maa_channel_t *ch_data, - uint8_t *ble_buffer); - -/*============================================================================== - * ASYNC MAA - Non-blocking 8-channel capture - * - * Design: State machine driven by BLE TX complete events - * Flow: - * maa? cmd -> maa_async_start() -> capture CH0 -> TX reb: -> TX red: ... - * BLE_NUS_EVT_TX_RDY -> maa_async_continue() -> TX next packet or next channel - * All done -> TX raa: -> state=IDLE - *============================================================================*/ - -/** @brief MAA async state machine states */ -typedef enum { - MAA_ASYNC_IDLE = 0, /**< Not active */ - MAA_ASYNC_CAPTURING, /**< ADC capture in progress */ - MAA_ASYNC_TX_HEADER, /**< Sending reb: header */ - MAA_ASYNC_TX_DATA, /**< Sending red: data packets */ - MAA_ASYNC_NEXT_CHANNEL, /**< Preparing next channel */ - MAA_ASYNC_COMPLETE /**< Sending raa: and finishing */ -} maa_async_state_t; - -/** @brief MAA async context */ -typedef struct { - maa_async_state_t state; /**< Current state */ - uint8_t current_ch; /**< Current channel (0~7) */ - uint8_t current_pkt; /**< Current packet index */ - uint16_t data_offset; /**< Bytes sent so far for current channel */ - uint8_t freq_option; /**< Frequency option */ - uint16_t delay_us; /**< Capture delay */ - uint16_t num_samples; /**< Samples per channel */ - uint8_t cycles; /**< Burst cycles */ - uint16_t averaging; /**< Averaging count */ - uint8_t *ble_buffer; /**< Working buffer for BLE packets */ - dr_maa_channel_t channels[MAA_NUM_CHANNELS]; /**< Captured data for each channel */ - uint16_t total_packets; /**< Total packets for current channel */ - uint16_t data_packets; /**< Data packets for current channel */ -} maa_async_ctx_t; - -/** - * @brief Start async MAA 8-channel capture - * - * Initiates the async state machine. Captures CH0 and begins transmission. - * Subsequent packets are sent when maa_async_on_tx_ready() is called. - * - * @param freq_option Frequency: 0=1.8MHz, 1=2.1MHz, 2=2.0MHz, 3=1.7MHz - * @param delay_us Capture delay (us) - * @param num_samples Samples per channel (1~200) - * @param cycles Burst cycles (3~9) - * @param averaging Averaging count (1~1000) - * @param ble_buffer Working buffer (>= 240 bytes) - * @return dr_adc_err_t DR_ADC_OK if started successfully - */ -dr_adc_err_t maa_async_start(uint8_t freq_option, uint16_t delay_us, - uint16_t num_samples, uint8_t cycles, - uint16_t averaging, uint8_t *ble_buffer); - -/** - * @brief Handle BLE TX ready event - * - * Called from BLE_NUS_EVT_TX_RDY handler. Sends next packet or - * transitions to next state. - * - * @return true if more work pending, false if complete or idle - */ -bool maa_async_on_tx_ready(void); - -/** - * @brief Check if async MAA is active - * @return true if state != IDLE - */ -bool maa_async_is_busy(void); - -/** - * @brief Get current async state (for debugging) - * @return Current state - */ -maa_async_state_t maa_async_get_state(void); - -/** - * @brief Abort async MAA operation - */ -void maa_async_abort(void); - -#endif /* DR_ADC121S051_H */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_util.c b/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_util.c deleted file mode 100644 index 11317c6..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_util.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "dr_util.h" -#include "parser.h" - -extern void single_format_data(uint8_t *buffer, const char *tag, uint16_t value); -extern void format_data(uint8_t *buffer, const char *tag, uint16_t *data, uint8_t length); -extern void binary_tx_handler(uint8_t *buffer, uint8_t length); -extern uint8_t ble_bin_buffer[]; - -/* Use dr_binary_tx_safe from main.c - has retry logic for BLE TX queue */ -extern void dr_binary_tx_safe(uint8_t const *ble_bin_buff, uint16_t length); - -void dr_ble_return_1(const char *tag, uint16_t value) -{ - single_format_data(ble_bin_buffer, tag, value); - dr_binary_tx_safe(ble_bin_buffer, 3); /* Use safe TX with retry */ -} - -void dr_ble_return_2(const char *tag, uint16_t v1, uint16_t v2) -{ - ble_bin_buffer[0] = tag[0]; - ble_bin_buffer[1] = tag[1]; - ble_bin_buffer[2] = tag[2]; - ble_bin_buffer[3] = tag[3]; - - ble_bin_buffer[4] = (uint8_t)(v1 >> 8); - ble_bin_buffer[5] = (uint8_t)(v1 & 0xFF); - ble_bin_buffer[6] = (uint8_t)(v2 >> 8); - ble_bin_buffer[7] = (uint8_t)(v2 & 0xFF); - - dr_binary_tx_safe(ble_bin_buffer, 4); /* Use safe TX with retry */ -} - -void dr_ble_return_3(const char *tag, uint16_t v1, uint16_t v2, uint16_t v3) -{ - ble_bin_buffer[0] = tag[0]; - ble_bin_buffer[1] = tag[1]; - ble_bin_buffer[2] = tag[2]; - ble_bin_buffer[3] = tag[3]; - - ble_bin_buffer[4] = (uint8_t)(v1 >> 8); - ble_bin_buffer[5] = (uint8_t)(v1 & 0xFF); - ble_bin_buffer[6] = (uint8_t)(v2 >> 8); - ble_bin_buffer[7] = (uint8_t)(v2 & 0xFF); - ble_bin_buffer[8] = (uint8_t)(v3 >> 8); - ble_bin_buffer[9] = (uint8_t)(v3 & 0xFF); - - dr_binary_tx_safe(ble_bin_buffer, 5); /* Use safe TX with retry */ -} - -void dr_ble_debug(uint16_t point_id, uint16_t value) -{ - /* Use dedicated buffer to avoid conflicts with ble_bin_buffer */ - static uint8_t dbg_buffer[8]; - - dbg_buffer[0] = 'd'; - dbg_buffer[1] = 'b'; - dbg_buffer[2] = 'g'; - dbg_buffer[3] = ':'; - - dbg_buffer[4] = (uint8_t)(point_id >> 8); - dbg_buffer[5] = (uint8_t)(point_id & 0xFF); - dbg_buffer[6] = (uint8_t)(value >> 8); - dbg_buffer[7] = (uint8_t)(value & 0xFF); - - dr_binary_tx_safe(dbg_buffer, 4); -} - -void dr_ble_return_piezo_1(const char *tag, uint16_t value) -{ - /* Use dedicated buffer for piezo responses to avoid conflicts with ble_bin_buffer */ - static uint8_t piezo_buffer[8]; - - piezo_buffer[0] = tag[0]; - piezo_buffer[1] = tag[1]; - piezo_buffer[2] = tag[2]; - piezo_buffer[3] = tag[3]; - - piezo_buffer[4] = (uint8_t)(value >> 8); - piezo_buffer[5] = (uint8_t)(value & 0xFF); - - dr_binary_tx_safe(piezo_buffer, 3); /* 6 bytes = 3 words */ -} diff --git a/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_util.h b/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_util.h deleted file mode 100644 index 4cf8078..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/cmd/dr_util.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef DR_UTIL_H -#define DR_UTIL_H - -#include - -void dr_ble_return_1(const char *tag, uint16_t value); -void dr_ble_return_2(const char *tag, uint16_t v1, uint16_t v2); -void dr_ble_return_3(const char *tag, uint16_t v1, uint16_t v2, uint16_t v3); -void dr_ble_return_3_be(const char *tag, uint16_t v1, uint16_t v2, uint16_t v3); - -/* Piezo dedicated BLE return - uses separate buffer to avoid conflicts */ -void dr_ble_return_piezo_1(const char *tag, uint16_t value); - -/* BLE debug output - sends "dbg:" + point_id + value */ -void dr_ble_debug(uint16_t point_id, uint16_t value); - -#endif /* DR_UTIL_H */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/cmd/parser.c b/project/ble_peripheral/ble_app_bladder_patch/cmd/parser.c deleted file mode 100644 index 98c6c25..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/cmd/parser.c +++ /dev/null @@ -1,1174 +0,0 @@ -/* - * 2025-12-08 power loop bug fix - * 2025-12-07 msn, mta, mqq - * 2025-12-04 by Charles KWON - * parser.c : Common parser + command table + handlers - * - Firmware/PC shared - * - Hardware-dependent parts left as TODO - * - Added CRC16 validation support - */ - -#include "parser.h" -#include - -#include "nrf_gpio.h" -#include "nrf_delay.h" -#include "dr_piezo.h" -#include "dr_util.h" -#include "dr_adc121s051.h" - - - -// ======================================== -// External function declarations -// ======================================== - -/* Sensor functions */ -extern void battery_level_meas(void); -extern void pressure_all_level_meas(void); -extern void tmp235_voltage_level_meas(void); - - -/* Device control functions */ -extern int device_activated(void); -extern int device_sleep_mode(void); - -/* Error handling */ -extern void param_error(const char *cmd); - -/* BLE transmission */ -extern void single_format_data(uint8_t *buffer, const char *tag, uint16_t value); -extern void binary_tx_handler(const uint8_t *buffer, uint16_t length); -extern void dr_sd_delay_ms(uint32_t ms); /* Softdevice-friendly delay */ - - - - -// ======================================== -// External variables -// ======================================== - -extern volatile bool processing; -extern bool device_status; -extern uint8_t resetCount; -extern uint8_t ble_bin_buffer[]; - -extern uint8_t simple_samples_in_buffer; -extern uint8_t m_pd_adc_cnt; -extern bool con_single; -extern bool lock_check; - - -extern bool info4; // addtional info -extern bool ble_got_new_data; // BLE data flag -extern uint8_t m_pd_adc_cnt; // PD ADC count -extern bool go_batt; // battery -extern bool motion_data_once; // IMU data flag -extern int imu_read_direct(void); // IMU direct register read + BLE send - -extern void pressure_all_level_meas(void); // pressure sensor -extern void battery_timer_stop(void); // battery timer -extern void main_timer_start(void); // main timer - - -extern void dr_piezo_power_on( void ); -extern void dr_piezo_burst_sw(uint8_t cycles); -extern void dr_piezo_burst_sw_18mhz(uint8_t cycles); -extern void dr_piezo_burst_sw_20mhz(uint8_t cycles); -extern void dr_piezo_burst_sw_17mhz(uint8_t cycles); - -/* ---- Global variable definitions (extern in header) ---- */ -dr_platform_if_t g_plat = { 0, 0, 0 }; -bool g_log_enable = false; - -/* ---- Internal constants/structures ---- */ - -#define DR_MAX_DATA 128 /* Max data length after TAG */ - -typedef struct { - char tag[5]; /* "sta?" etc 4 chars + '\0' */ - uint8_t data[DR_MAX_DATA]; /* Raw data after TAG */ - uint8_t data_len; /* Length of data[] */ -} ParsedCmd; - -/* ---- Internal utility functions ---- */ - -/* Copy TAG */ -static void dr_copy_tag(const uint8_t *buf, char *tag_out) -{ - tag_out[0] = (char)buf[0]; - tag_out[1] = (char)buf[1]; - tag_out[2] = (char)buf[2]; - tag_out[3] = (char)buf[3]; - tag_out[4] = '\0'; -} - -/* TAG comparison (4 chars) */ -static bool dr_tag_eq(const char *tag, const char *key4) -{ - return (tag[0] == key4[0] && - tag[1] == key4[1] && - tag[2] == key4[2] && - tag[3] == key4[3]); -} - -/* Extract uint16 little endian: word_index based (0 -> data[0], data[1]) */ -/* Extract uint16 BIG endian: word_index based (0 -> data[0], data[1]) */ -/* Extract uint16 LITTLE endian: word_index based (0 -> data[0], data[1]) */ -static bool dr_get_u16(const ParsedCmd *cmd, uint8_t word_index, uint16_t *out) -{ - uint8_t pos = (uint8_t)(word_index * 2); - if (cmd->data_len < (uint8_t)(pos + 2)) { - return false; - } - - // Little Endian: data[pos] = low byte, data[pos+1] = high byte - *out = (uint16_t)cmd->data[pos] - | (uint16_t)((uint16_t)cmd->data[pos + 1] << 8); - - return true; -} - -/* Extract ASCII: data[offset..offset+len] -> out, '\0' terminated */ -/* EEPROM에서 텍스트 쓸 때 ASCII 문자열 추출 -> 추후 Flash Memory 커맨드에서 재활용 가능 */ -static void dr_get_ascii(const ParsedCmd *cmd, uint8_t offset, - char *out, uint8_t max_len) -{ - uint8_t i; - uint8_t remain; - - if (offset >= cmd->data_len) { - out[0] = '\0'; - return; - } - - remain = (uint8_t)(cmd->data_len - offset); - if (remain > max_len) { - remain = max_len; - } - - for (i = 0; i < remain; i++) { - out[i] = (char)cmd->data[offset + i]; - } - out[remain] = '\0'; -} - -/* ---- CRC16 functions ---- */ - -/* CRC16 computation - matches Nordic SDK crc16_compute */ -static uint16_t dr_crc16_compute(const uint8_t *p_data, uint32_t size, const uint16_t *p_crc) -{ - uint32_t i; - uint16_t crc = (p_crc == NULL) ? 0xFFFF : *p_crc; - - for (i = 0; i < size; i++) - { - crc = (uint8_t)(crc >> 8) | (crc << 8); - crc ^= p_data[i]; - crc ^= (uint8_t)(crc & 0xFF) >> 4; - crc ^= (crc << 8) << 4; - crc ^= ((crc & 0xFF) << 4) << 1; - } - - return crc; -} - -/* CRC16 check: compare computed vs expected */ -static bool dr_crc16_check(const uint8_t *p_data, uint32_t data_len, uint16_t expected_crc) -{ - uint16_t computed_crc = dr_crc16_compute(p_data, data_len, NULL); - return (computed_crc == expected_crc); -} - -/* CRC16 packet check: last 2 bytes are CRC (little endian) */ -static bool dr_crc16_check_packet(const uint8_t *packet, uint32_t packet_len) -{ - uint16_t expected_crc; - uint32_t data_len; - - if (packet_len < 2) { - return false; - } - - data_len = packet_len - 2; - - /* Extract CRC: little endian (low byte first) */ - expected_crc = (uint16_t)packet[packet_len - 2] - | ((uint16_t)packet[packet_len - 1] << 8); - - if (g_plat.log && g_log_enable) { - g_plat.log("CRC check: expected=0x%04X\n", expected_crc); - } - - return dr_crc16_check(packet, data_len, expected_crc); -} - -/* ---- Raw buffer -> ParsedCmd ---- */ - -static bool dr_parse_cmd(const uint8_t *buffer, uint8_t length, ParsedCmd *out) -{ - uint8_t i; - - if (length < 4) { - return false; /* Not even TAG received */ - } - - /* CRC check if enabled */ - if (g_plat.crc_check) { - if (!dr_crc16_check_packet(buffer, length)) { - if (g_plat.log && g_log_enable) { - g_plat.log("CRC check FAILED!\n"); - } - return false; - } - - /* CRC validated - remove CRC bytes from data */ - length = (uint8_t)(length - 2); - - if (g_plat.log && g_log_enable) { - g_plat.log("CRC check OK\n"); - } - } - - dr_copy_tag(buffer, out->tag); - - out->data_len = (length > 4) ? (uint8_t)(length - 4) : 0; - if (out->data_len > DR_MAX_DATA) { - out->data_len = DR_MAX_DATA; - } - - for (i = 0; i < out->data_len; i++) { - out->data[i] = buffer[4 + i]; - } - - if (g_plat.log && g_log_enable) { - g_plat.log("parse_cmd: TAG='%s', data_len=%u\n", - out->tag, out->data_len); - } - - return true; -} - - - -/* ---- Handler prototypes (Harbour style: int return) ---- */ - -/* A. Device Status */ -static int Cmd_mta(const ParsedCmd *cmd); -static int Cmd_sta(const ParsedCmd *cmd); -static int Cmd_str(const ParsedCmd *cmd); - -/* F. PD-ADC M48 Full Measurement Series */ -static int Cmd_mcj(const ParsedCmd *cmd); -static int Cmd_sej(const ParsedCmd *cmd); -static int Cmd_ssj(const ParsedCmd *cmd); - -/* I. Sensor Measurements */ -static int Cmd_msn(const ParsedCmd *cmd); -static int Cmd_spn(const ParsedCmd *cmd); -static int Cmd_sso(const ParsedCmd *cmd); -static int Cmd_ssp(const ParsedCmd *cmd); - -/* J. Power / Reset / Version / Security */ -static int Cmd_ssq(const ParsedCmd *cmd); -static int Cmd_ssr(const ParsedCmd *cmd); -static int Cmd_sss(const ParsedCmd *cmd); -static int Cmd_sst(const ParsedCmd *cmd); -static int Cmd_ssv(const ParsedCmd *cmd); - -static int Cmd_mpa(const ParsedCmd *cmd); -static int Cmd_mpc(const ParsedCmd *cmd); -static int Cmd_mdc(const ParsedCmd *cmd); -static int Cmd_mec(const ParsedCmd *cmd); -static int Cmd_maa(const ParsedCmd *cmd); /* 8-channel all capture */ -static int Cmd_msp(const ParsedCmd *cmd); /* IMU 6-axis raw data (single shot) */ -static int Cmd_cmd(const ParsedCmd *cmd); - -/* ---- Command Table ---- */ - -typedef struct { - char tag[5]; /* "sta?" */ - bool enabled; /* false = handler won't be called */ - int (*handler)(const ParsedCmd *cmd); /* 1=success, 0=fail */ -} CmdEntry; - -static CmdEntry g_cmd_table[] = { - - /* sudo command */ - { "cmd?", true, Cmd_cmd }, // Piezo Activate - - /* Piezo command */ - { "mpa?", true, Cmd_mpa }, // Piezo Activate - { "mpc?", true, Cmd_mpc }, // Piezo Cycles control command, 3,4,5,6,7 - { "mdc?", true, Cmd_mdc }, // Piezo burst + Echo capture (12-bit packed) - { "mec?", true, Cmd_mec }, // Piezo burst + Echo capture (16-bit raw) - { "maa?", true, Cmd_maa }, // 8-channel all capture (mode: 0=raw, 1=delta) - { "msp?", true, Cmd_msp }, // IMU 6-axis raw data (single shot) - - /* A. Device Status */ - { "mta?", true, Cmd_mta }, - { "sta?", true, Cmd_sta }, - { "str?", false, Cmd_str }, - /* F. PD-ADC M48 Full Measurement Series */ - { "mcj?", true, Cmd_mcj }, - { "scj?", true, Cmd_mcj }, - - { "sej?", false, Cmd_sej }, - { "ssj?", false, Cmd_ssj }, - /* I. Sensor Measurements */ - { "msn?", true, Cmd_msn }, - { "ssn?", true, Cmd_msn }, // snn compatible command for battery check - - { "spn?", false, Cmd_spn }, - { "sso?", false, Cmd_sso }, - { "ssp?", false, Cmd_ssp }, - - /* J. Power / Reset / Version / Security */ - { "ssq?", false, Cmd_ssq }, - { "ssr?", false, Cmd_ssr }, - { "sss?", false, Cmd_sss }, - { "sst?", false, Cmd_sst }, - { "ssv?", false, Cmd_ssv }, - -}; - -static const uint16_t g_cmd_count = - (uint16_t)(sizeof(g_cmd_table) / sizeof(g_cmd_table[0])); - -/* ---- Command dispatcher ---- */ -static int dr_cmd_dispatch(const ParsedCmd *cmd) -{ - uint16_t i; - char tag_lower[5]; - - /* tag command convert to lower case */ - for (i = 0; i < 4 && cmd->tag[i]; i++) { - tag_lower[i] = (cmd->tag[i] >= 'A' && cmd->tag[i] <= 'Z') - ? (cmd->tag[i] + 32) : cmd->tag[i]; - } - tag_lower[i] = '\0'; - - for (i = 0; i < g_cmd_count; i++) { - if (dr_tag_eq(tag_lower, g_cmd_table[i].tag)) { - - if (!g_cmd_table[i].enabled) { - if (g_plat.log && g_log_enable) { - g_plat.log("Command '%s' disabled\n", cmd->tag); - } - return 0; - } - - if (g_plat.log && g_log_enable) { - g_plat.log("Run handler '%s'\n", cmd->tag); - } - - return g_cmd_table[i].handler(cmd); - } - } - - if (g_plat.log && g_log_enable) { - g_plat.log("Unknown TAG '%s'\n", cmd->tag); - } - return 0; -} - -/* -Main Parser called from external code -*/ - -int dr_cmd_parser(const uint8_t *buf, uint8_t len) -{ - ParsedCmd cmd; - - if (!dr_parse_cmd(buf, len, &cmd)) { - if (g_plat.log && g_log_enable) { - g_plat.log("parse_cmd failed (len=%u)\n", len); - } - - /* CRC 실패 시 에러 응답 전송 */ - if (g_plat.crc_check && g_plat.tx_bin) { - single_format_data(ble_bin_buffer, "crc!", 65530); - binary_tx_handler(ble_bin_buffer, 3); - } - return 9; /* CRC 실패 또는 파싱 실패 */ - } - - return dr_cmd_dispatch(&cmd); - - - - -} - -/* ---- Each Command Handler implementation (Stub) ---- */ -/* In actual firmware, replace TODO sections with hardware/EEPROM integration */ - -/* A. Device Status */ -static int Cmd_mta(const ParsedCmd *cmd) -{ - uint16_t mode = 0; - - // Reset count (sta? replacement ) - resetCount = 0; - - // Extract mode - (void)dr_get_u16(cmd, 0, &mode); - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mta] mode=%u\r\n", mode); - } - - // Process mode ( mta?1 ) - if (mode == 1) { - if (device_activated() == 0) { - device_status = true; - } - } - else if (mode == 0) { // mta?0 - if (device_status == true) { - if (device_sleep_mode() == 0) { - device_status = false; - } - } - } - - if (g_plat.tx_bin) { - single_format_data(ble_bin_buffer, "rta:", mode); - binary_tx_handler(ble_bin_buffer, 3); - } - - return 1; -} - - -/* ---- Each Command Handler implementation (Stub) ---- */ -/* In actual firmware, replace TODO sections with hardware/EEPROM integration */ - -/* A. Device Status */ -static int Cmd_sta(const ParsedCmd *cmd) -{ - uint16_t mode = 0; - - // Reset count (sta? replacement ) - resetCount = 0; - - // Extract mode - (void)dr_get_u16(cmd, 0, &mode); - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mta] mode=%u\r\n", mode); - } - - // Process mode ( mta?1 ) - if (mode == 1) { - if (device_activated() == 0) { - device_status = true; - } - } - else if (mode == 0) { // mta?0 - if (device_status == true) { - if (device_sleep_mode() == 0) { - device_status = false; - } - } - } - - if (g_plat.tx_bin) { - single_format_data(ble_bin_buffer, "sta:", mode); - binary_tx_handler(ble_bin_buffer, 3); - } - - return 1; -} - - -static int Cmd_str(const ParsedCmd *cmd) -{ - (void)cmd; - /* TODO: read actual device_status */ - uint8_t status = 1; - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_str] read status=%u\n", status); - } - - if (g_plat.tx_bin) { - uint8_t resp[4] = { 'r','t','r', status }; - g_plat.tx_bin(resp, 4); - } - return 1; -} - - -/** - * @brief PD-ADC M48 Full Measurement - MODE 2 (scj? ? mcj?) - * - * Original: scj? - * New: mcj? - * Response: rcj: (from m48 measurement callback) - * - * MODE 2: Pressure + M48 Full Measurement - * - Pressure sensor measurement (pressure1 + pressure2) - * - 48 LED-PD ADC measurement - * - Battery, Temperature, IMU data - * - * Preconditions: - * - Device must be activated (device_status == true) - * - Not currently processing - */ -static int Cmd_mcj(const ParsedCmd *cmd) -{ - (void)cmd; - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mcj] PD-ADC M48 MODE=2 (Press + M48)\r\n"); - } - - /* Check device activation status */ - if (device_status != true) { - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mcj] ERROR: Device not activated\r\n"); - } - - if (g_plat.tx_bin) { - param_error("mcj?"); - } - return 1; - } - - info4 = true; - ble_got_new_data = false; - processing = true; - - /* Start pressure measurement */ - pressure_all_level_meas(); - - battery_timer_stop(); - - /* Enable battery, temperature, IMU measurement */ - go_batt = true; - motion_data_once = true; - - /* Start main timer */ - main_timer_start(); - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mcj] Measurement started\r\n"); - } - - return 1; -} - -static int Cmd_sej(const ParsedCmd *cmd) -{ - (void)cmd; - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_sej] MODE=4 (M48 + batt + IMU)\n"); - } - return 1; -} - -static int Cmd_ssj(const ParsedCmd *cmd) -{ - (void)cmd; - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_ssj] MODE=0 (M48 + batt/IMU combined)\n"); - } - return 1; -} - -/* I. Sensor Measurements */ -static int Cmd_msn(const ParsedCmd *cmd) -{ - (void)cmd; - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_msn] Measure battery level\n"); - } - battery_level_meas(); - return 1; -} - - - - -static int Cmd_spn(const ParsedCmd *cmd) -{ - (void)cmd; - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_spn] Measure pressure1 & 2\n"); - } - return 1; -} - -static int Cmd_sso(const ParsedCmd *cmd) -{ - (void)cmd; - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_sso] Measure LED temperature\n"); - } - return 1; -} - -static int Cmd_ssp(const ParsedCmd *cmd) -{ - char mode = '1'; - if (cmd->data_len > 0) { - mode = (char)cmd->data[0]; - } - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_ssp] Motion sensor raw, mode='%c'\n", mode); - } - return 1; -} - -/* J. Power / Reset / Version / Security */ -static int Cmd_ssq(const ParsedCmd *cmd) -{ - (void)cmd; - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_ssq] Power off\n"); - } - return 1; -} - -static int Cmd_ssr(const ParsedCmd *cmd) -{ - (void)cmd; - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_ssr] Bond delete\n"); - } - return 1; -} - -static int Cmd_sss(const ParsedCmd *cmd) -{ - (void)cmd; - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_sss] Device reset\n"); - } - return 1; -} - -static int Cmd_sst(const ParsedCmd *cmd) -{ - (void)cmd; - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_sst] Ready\n"); - } - return 1; -} - -static int Cmd_ssv(const ParsedCmd *cmd) -{ - (void)cmd; - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_ssv] Read firmware version\n"); - } - return 1; -} - -static int Cmd_mpa(const ParsedCmd *cmd) -{ - (void)cmd; - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mpa] Piezo Activation\n"); - } - - dr_piezo_power_on(); - dr_piezo_system_init(); - - if (g_plat.tx_bin) { - single_format_data(ble_bin_buffer, "rpa:", 1); - binary_tx_handler(ble_bin_buffer, 3); - } - - return 1; -} - - -/** - * @brief Piezo burst command with frequency option - * @param cmd->data[0-1]: cycles (3~9), default=5 - * @param cmd->data[2-3]: freq_option (0=1.8MHz, 1=2.1MHz, 2=2.0MHz, 3=1.7MHz), default=1 - * @return Response: rpc:cycles - * - * Usage from Harbour: - * mpc?[cycles][freq] where freq: 0=1.8MHz, 1=2.1MHz (default), 2=2.0MHz, 3=1.7MHz - * Example: mpc?0x05,0x00,0x01,0x00 -> 5 cycles at 2.1MHz - * Example: mpc?0x05,0x00,0x00,0x00 -> 5 cycles at 1.8MHz - * Example: mpc?0x05,0x00,0x02,0x00 -> 5 cycles at 2.0MHz - * Example: mpc?0x05,0x00,0x03,0x00 -> 5 cycles at 1.7MHz - */ -static int Cmd_mpc(const ParsedCmd *cmd) -{ - uint16_t cycles = 5; /* default */ - uint16_t freq_option = 1; /* 0=1.8MHz, 1=2.1MHz, 2=2.0MHz, 3=1.7MHz */ - uint16_t piezo_ch = 0; /* Piezo channel 0~7, default 0 */ - - /* Extract cycles (word 0) */ - (void)dr_get_u16(cmd, 0, &cycles); - - /* Extract frequency option (word 1) */ - (void)dr_get_u16(cmd, 1, &freq_option); - - /* Extract piezo channel (word 2) */ - (void)dr_get_u16(cmd, 2, &piezo_ch); - - /* Validate piezo channel: 0~7 jhChun 26.01.29 */ - if (piezo_ch > 7) piezo_ch = 0; - - if (g_plat.log && g_log_enable) { - const char *freq_str = (freq_option == 0) ? "1.8MHz" : - (freq_option == 1) ? "2.1MHz" : - (freq_option == 2) ? "2.0MHz" : "1.7MHz"; - g_plat.log("[Cmd_mpc] cycles=%u, freq=%u (%s), piezo=%u\r\n", - cycles, freq_option, freq_str, piezo_ch); - } - - /* Range check: 3~9 */ - if (cycles < 3 || cycles > 9) { - dr_ble_return_1("rpc:", 2); /* Error: out of range */ - return 1; - } - - /* Select piezo channel */ - dr_piezo_select_channel((uint8_t)piezo_ch); - - /* Execute burst based on frequency option */ - switch (freq_option) { - case 0: - dr_piezo_burst_sw_18mhz((uint8_t)cycles); - break; - case 2: - dr_piezo_burst_sw_20mhz((uint8_t)cycles); - break; - case 3: - dr_piezo_burst_sw_17mhz((uint8_t)cycles); - break; - case 1: - default: - dr_piezo_burst_sw((uint8_t)cycles); /* 2.1MHz */ - break; - } - - /* Response */ - dr_ble_return_1("rpc:", (uint8_t)cycles); - - return 1; -} - - -/** - * @brief Piezo burst + Echo capture command - * @param cmd->data[0]: cycles (3~9), default=5 - * @param cmd->data[1-2]: delay_us (0~65535), default=1000 - * @param cmd->data[3-4]: num_samples (1~8192), default=4096 - * @return Multiple packets with 12-bit packed data - * - * Response format (multi-packet, 12-bit packed): - * - * First packet ("rdc:"): - * [0-3]: "rdc:" - * [4-5]: peak_raw (uint16_t, little-endian) - * [6-7]: peak_index (uint16_t) - * [8-9]: baseline_raw (uint16_t) - * [10-11]: num_samples (uint16_t) - * [12-13]: total_packets (uint16_t) - * [14...]: 12-bit packed ADC data (first chunk) - * - * Continuation packets ("rdd:"): - * [0-3]: "rdd:" - * [4-5]: packet_index (uint16_t, 1-based) - * [6...]: 12-bit packed ADC data (continuation) - * - * Last packet marker ("rde:"): - * [0-3]: "rde:" - * [4-5]: total_bytes_sent (uint16_t) - * - * 12-bit packing: 2 samples (24 bits) -> 3 bytes - * Byte0 = sample0[7:0] - * Byte1 = sample1[3:0] << 4 | sample0[11:8] - * Byte2 = sample1[11:4] - */ -#define MDC_BLE_MTU_SIZE 240 /* Safe BLE packet size */ -#define MDC_FIRST_HEADER_LEN 14 /* "rdc:" + header */ -#define MDC_CONT_HEADER_LEN 6 /* "rdd:" + packet_index */ -#define MDC_FIRST_DATA_LEN (MDC_BLE_MTU_SIZE - MDC_FIRST_HEADER_LEN) -#define MDC_CONT_DATA_LEN (MDC_BLE_MTU_SIZE - MDC_CONT_HEADER_LEN) - -/** - * @brief Piezo burst + Echo capture command (12-bit packed) - * - * PROTOCOL v3: Small header packet + separate data packets with delays - * This avoids large packet loss in BLE stack. - * - * Response format: - * Packet 1 (rdb:): header only (14 bytes) - * Packet 2~N (rdd:): pkt_idx(2) + packed_data (up to 234 bytes) - * Final (rde:): total_packets(2) - */ -static int Cmd_mdc(const ParsedCmd *cmd) -{ - uint16_t cycles = 5; - uint16_t delay_us = 1000; - uint16_t num_samples = 4096; - - /* Extract parameters */ - (void)dr_get_u16(cmd, 0, &cycles); - (void)dr_get_u16(cmd, 1, &delay_us); - (void)dr_get_u16(cmd, 2, &num_samples); - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mdc] cycles=%u, delay=%uus, samples=%u\r\n", - cycles, delay_us, num_samples); - } - - /* Range check */ - if (cycles < 3) cycles = 3; - if (cycles > 9) cycles = 9; - if (num_samples > 8192) num_samples = 8192; - if (num_samples < 1) num_samples = 1; - - /* Execute burst + echo capture */ - dr_adc_echo_t echo; - dr_adc_err_t err = dr_adc_burst_and_capture( - (uint8_t)cycles, delay_us, num_samples, &echo); - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mdc] err=%d, peak=%u@%u, base=%u, n=%u\r\n", - err, echo.peak_raw, echo.peak_index, echo.baseline_raw, echo.num_samples); - } - - if (g_plat.tx_bin) { - const uint16_t *raw_buffer = dr_adc_get_echo_buffer(); - - /* Calculate packed data size: 2 samples -> 3 bytes */ - uint16_t packed_data_bytes = ((echo.num_samples + 1) / 2) * 3; - uint16_t data_per_packet = MDC_BLE_MTU_SIZE - MDC_CONT_HEADER_LEN; /* 234 bytes */ - uint16_t data_packets = (packed_data_bytes + data_per_packet - 1) / data_per_packet; - if (data_packets == 0) data_packets = 1; - uint16_t total_packets = 1 + data_packets; /* header + data packets */ - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mdc] packed=%u bytes, packets=%u\r\n", packed_data_bytes, total_packets); - } - - /* Packet 1: rdb: header only (14 bytes) */ - ble_bin_buffer[0] = 'r'; - ble_bin_buffer[1] = 'd'; - ble_bin_buffer[2] = 'b'; - ble_bin_buffer[3] = ':'; - ble_bin_buffer[4] = (uint8_t)(total_packets & 0xFF); - ble_bin_buffer[5] = (uint8_t)(total_packets >> 8); - ble_bin_buffer[6] = (uint8_t)(echo.peak_raw & 0xFF); - ble_bin_buffer[7] = (uint8_t)(echo.peak_raw >> 8); - ble_bin_buffer[8] = (uint8_t)(echo.peak_index & 0xFF); - ble_bin_buffer[9] = (uint8_t)(echo.peak_index >> 8); - ble_bin_buffer[10] = (uint8_t)(echo.baseline_raw & 0xFF); - ble_bin_buffer[11] = (uint8_t)(echo.baseline_raw >> 8); - ble_bin_buffer[12] = (uint8_t)(echo.num_samples & 0xFF); - ble_bin_buffer[13] = (uint8_t)(echo.num_samples >> 8); - binary_tx_handler(ble_bin_buffer, 7); /* 14 bytes = 7 words */ - nrf_delay_ms(100); /* Wait for BLE stack */ - - /* Packet 2~N: rdd: data packets with packed 12-bit samples */ - uint16_t src_idx = 0; - for (uint16_t pkt = 0; pkt < data_packets; pkt++) { - ble_bin_buffer[0] = 'r'; - ble_bin_buffer[1] = 'd'; - ble_bin_buffer[2] = 'd'; - ble_bin_buffer[3] = ':'; - ble_bin_buffer[4] = (uint8_t)(pkt & 0xFF); - ble_bin_buffer[5] = (uint8_t)(pkt >> 8); - - uint16_t dst_idx = 6; - uint16_t bytes_this_pkt = 0; - while (src_idx < echo.num_samples && bytes_this_pkt < data_per_packet) { - uint16_t s0 = raw_buffer[src_idx++] & 0x0FFF; - uint16_t s1 = (src_idx < echo.num_samples) ? (raw_buffer[src_idx++] & 0x0FFF) : 0; - - ble_bin_buffer[dst_idx++] = (uint8_t)(s0 & 0xFF); - ble_bin_buffer[dst_idx++] = (uint8_t)(((s1 & 0x0F) << 4) | ((s0 >> 8) & 0x0F)); - ble_bin_buffer[dst_idx++] = (uint8_t)(s1 >> 4); - bytes_this_pkt += 3; - } - - /* Ensure even byte count for word alignment */ - if (dst_idx & 1) ble_bin_buffer[dst_idx++] = 0; - binary_tx_handler(ble_bin_buffer, dst_idx / 2); /* bytes to words */ - nrf_delay_ms(100); /* Inter-packet delay */ - } - - /* Final packet: rde: end marker */ - ble_bin_buffer[0] = 'r'; - ble_bin_buffer[1] = 'd'; - ble_bin_buffer[2] = 'e'; - ble_bin_buffer[3] = ':'; - ble_bin_buffer[4] = (uint8_t)(total_packets & 0xFF); - ble_bin_buffer[5] = (uint8_t)(total_packets >> 8); - binary_tx_handler(ble_bin_buffer, 3); /* 6 bytes = 3 words */ - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mdc] sent rdb+rdd*%u+rde (%u samples)\r\n", - total_packets, echo.num_samples); - } - } - - return 1; -} - - -/* - -// The following code demonstrates an example of how to receive data from a client -// and echo the same data back to the client. - - - -static int Cmd_cmd(const ParsedCmd *cmd) -{ - uint16_t v1, v2, v3; - - if (cmd->data_len < 6) { - dr_ble_return_1("rmd:", 0); - return 1; - } - - // Little Endian ?? (PC? LE? ??) - v1 = (uint16_t)cmd->data[0] | ((uint16_t)cmd->data[1] << 8); - v2 = (uint16_t)cmd->data[2] | ((uint16_t)cmd->data[3] << 8); - v3 = (uint16_t)cmd->data[4] | ((uint16_t)cmd->data[5] << 8); - - dr_ble_return_3("rmd:", v1, v2, v3); - - return 1; -} - -*/ - -/** - * @brief Piezo burst + Echo capture with 16-bit raw data (no compression) - * @param cmd->data[0]: cycles (3~9), default=5 - * @param cmd->data[1-2]: delay_us (0~65535), default=100 - * @param cmd->data[3-4]: num_samples (1~200), default=140 (20cm target) - * @return Multiple packets with 16-bit raw data - * - * Response format (multi-packet, 16-bit raw - no compression): - * - * First packet ("rec:"): - * [0-3]: "rec:" - * [4-5]: peak_raw (uint16_t, little-endian) - * [6-7]: peak_index (uint16_t) - * [8-9]: baseline_raw (uint16_t) - * [10-11]: num_samples (uint16_t) - * [12-13]: total_packets (uint16_t) - * [14...]: 16-bit raw ADC data (first chunk, little-endian) - * - * Continuation packets ("red:"): - * [0-3]: "red:" - * [4-5]: packet_index (uint16_t, 1-based) - * [6...]: 16-bit raw ADC data (continuation) - * - * Last packet marker ("ree:"): - * [0-3]: "ree:" - * [4-5]: total_bytes_sent (uint16_t) - * - * 16-bit raw format: Each sample = 2 bytes (uint16, little-endian) - * Byte0 = Sample[7:0] - * Byte1 = Sample[15:8] - * - * Example: 140 samples (20cm) = 280 bytes = 2 packets - */ -static int Cmd_mec(const ParsedCmd *cmd) -{ - uint16_t freq_option = 0; /* 0=1.8MHz (default), 1=2.1MHz, 2=2.0MHz, 3=1.7MHz */ - uint16_t delay_us = 20; /* Default 20us */ - uint16_t num_samples = 140; /* Default for 20cm target */ - uint16_t cycles = 5; /* Default 5 cycles (valid: 3~7) */ - uint16_t averaging = 1; /* Default 1 (no averaging), max 1000 */ - uint16_t piezo_ch = 0; /* Default piezo channel 0 (valid: 0~7) */ - - /* Extract parameters: mec [freq_option] [delay_us] [num_samples] [cycles] [averaging] [piezo_ch] */ - (void)dr_get_u16(cmd, 0, &freq_option); - (void)dr_get_u16(cmd, 1, &delay_us); - (void)dr_get_u16(cmd, 2, &num_samples); - (void)dr_get_u16(cmd, 3, &cycles); - (void)dr_get_u16(cmd, 4, &averaging); - (void)dr_get_u16(cmd, 5, &piezo_ch); - - /* Validate averaging: 1~1000, default 1 */ - if (averaging == 0) averaging = 1; - if (averaging > 1000) averaging = 1000; - - /* Validate piezo channel: 0~7 jhChun 26.01.29 */ - if (piezo_ch > 7) piezo_ch = 0; - - if (g_plat.log && g_log_enable) { - const char *freq_str = (freq_option == 0) ? "1.8MHz" : - (freq_option == 1) ? "2.1MHz" : - (freq_option == 2) ? "2.0MHz" : "1.7MHz"; - g_plat.log("[Cmd_mec] freq=%u (%s), delay=%uus, samples=%u, cycles=%u, avg=%u, piezo=%u\r\n", - freq_option, freq_str, delay_us, num_samples, cycles, averaging, piezo_ch); - } - - /* Use integrated burst + capture + transmit function - * This function handles: - * 1. ADC power on - * 2. Select piezo channel (0~7) - * 3. Piezo burst (frequency based on freq_option, cycles from param) - * 4. ADC capture (after delay_us) - repeated 'averaging' times - * 5. Average the captured samples - * 6. BLE transmission with proper packet timing - */ - dr_adc_err_t err = dr_adc_burst_capture_transmit( - (uint8_t)freq_option, delay_us, num_samples, (uint8_t)cycles, - (uint16_t)averaging, (uint8_t)piezo_ch, ble_bin_buffer, 0); /* 0=send raa */ - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_mec] result=%d\r\n", err); - } - - return 1; -} - - -static int Cmd_cmd(const ParsedCmd *cmd) -{ - uint16_t v1, v2, v3; - uint32_t pin_number; - - if (cmd->data_len < 6) { - dr_ble_return_1("rmd:", 0); - return 1; - } - - // Little Endian from PC to LE - v1 = (uint16_t)cmd->data[0] | ((uint16_t)cmd->data[1] << 8); // port - v2 = (uint16_t)cmd->data[2] | ((uint16_t)cmd->data[3] << 8); // pin - v3 = (uint16_t)cmd->data[4] | ((uint16_t)cmd->data[5] << 8); // 1=HIGH, 0=LOW - - // -- GPIO Test - - // Pin No: NRF_GPIO_PIN_MAP(port, pin) - pin_number = NRF_GPIO_PIN_MAP(v1, v2); - - // output - nrf_gpio_cfg_output(pin_number); - - // HIGH or LOW - if (v3 == 1) { - nrf_gpio_pin_set(pin_number); // HIGH - } else { - nrf_gpio_pin_clear(pin_number); // LOW - } - - // return : port, pin, state - dr_ble_return_3("rmd:", v1, v2, v3); - - return 1; -} - - -/** - * @brief 4-Channel All Capture Command (maa?) - ASYNC VERSION - * @param cmd->data[0-1]: mode (0=raw 16-bit async) - * @return Immediately. Data sent asynchronously via BLE_NUS_EVT_TX_RDY - * - * ASYNC ARCHITECTURE: - * - maa_async_start() initiates capture and sends CH0 header - * - BLE_NUS_EVT_TX_RDY callback drives remaining transmission - * - No blocking - SoftDevice can process events normally - * - Prevents BLE TX buffer overflow that caused firmware brick - * - * Hardcoded parameters: - * freq_option = 0 (1.8MHz) - * delay_us = 10 - * num_samples = 140 - * cycles = 7 - * averaging = 5 - * - * Response format: - * For each channel (CH0~CH3): - * reb: [total_pkts(2)] [peak(2)] [idx(2)] [baseline(2)] [samples(2)] - * red: [pkt_idx(2)] [data...] - * Final: - * raa: [status(2)] - * - * Version marker: 0xA000 (vA) = async 8-channel - */ -#define MAA_FREQ_OPTION 0 /* 1.8MHz */ -#define MAA_DELAY_US 10 /* 10us post-burst delay */ -#define MAA_NUM_SAMPLES 140 /* 140 samples (~25cm) */ -#define MAA_CYCLES 7 /* 7 cycles burst */ -#define MAA_AVERAGING 5 /* 5x averaging */ - -static int Cmd_maa(const ParsedCmd *cmd) -{ - uint16_t mode = 0; - dr_adc_err_t err; - - /* Extract mode parameter */ - (void)dr_get_u16(cmd, 0, &mode); - - /* Mode validation - only mode 0 (async raw) supported */ - if (mode > 0) { - dr_ble_return_1("raa:", 0xFFFF); - return 1; - } - - /* Check if already busy */ - if (maa_async_is_busy()) { - dr_ble_return_1("raa:", 0xFFFE); /* Busy */ - return 1; - } - - /*======================================================================= - * ASYNC 4-CHANNEL CAPTURE - * - maa_async_start() captures CH0 and sends first header - * - Subsequent packets sent via BLE_NUS_EVT_TX_RDY callback - * - No blocking delays - SoftDevice can process events normally - *=======================================================================*/ - err = maa_async_start( - (uint8_t)MAA_FREQ_OPTION, - MAA_DELAY_US, - MAA_NUM_SAMPLES, - (uint8_t)MAA_CYCLES, - (uint16_t)MAA_AVERAGING, - ble_bin_buffer - ); - - if (err != DR_ADC_OK) { - /* Start failed - error already sent by maa_async_start */ - return 1; - } - - /* Return immediately - async transmission in progress */ - /* raa: will be sent by state machine when complete */ - return 1; -} - - -/* msp? - Read IMU accel(xyz) + gyro(xyz) raw data, single shot - * Response: rsp: + 6 x uint16_t (accel_x, accel_y, accel_z, gyro_x, gyro_y, gyro_z) - */ -static int Cmd_msp(const ParsedCmd *cmd) -{ - (void)cmd; - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_msp] ENTER\r\n"); - } - - hw_i2c_init_once(); - - /* Direct register read — no timer, no DRDY, no callback */ - int rc = imu_read_direct(); - - if (g_plat.log && g_log_enable) { - g_plat.log("[Cmd_msp] imu_read_direct rc=%d\r\n", rc); - } - - return 1; -} diff --git a/project/ble_peripheral/ble_app_bladder_patch/cmd/parser.h b/project/ble_peripheral/ble_app_bladder_patch/cmd/parser.h deleted file mode 100644 index 565fe12..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/cmd/parser.h +++ /dev/null @@ -1,24 +0,0 @@ -/* parser.h */ -#ifndef PARSER_H -#define PARSER_H - -#include -#include - -/* Platform-dependent function pointer set */ -typedef struct { - void (*log)(const char *fmt, ...); - void (*tx_bin)(const uint8_t *buf, uint16_t len); - bool crc_check; -} dr_platform_if_t; - - -/* Global interface & log flag */ -extern dr_platform_if_t g_plat; -extern bool g_log_enable; - -/* Main parser entry point */ -int dr_cmd_parser(const uint8_t *buf, uint8_t len); - -#endif /* PARSER_H */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/cmd_parse.c b/project/ble_peripheral/ble_app_bladder_patch/cmd_parse.c index c2935ed..ded1e95 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/cmd_parse.c +++ b/project/ble_peripheral/ble_app_bladder_patch/cmd_parse.c @@ -205,7 +205,7 @@ bool length_error(const char *cmd , uint8_t target_length, uint8_t length) resp_error[3] = '!'; single_format_data(ble_bin_buffer, resp_error, err_code1); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); return false; } @@ -228,7 +228,7 @@ bool activate_error(const char *cmd , bool device_status) resp_error[3] = '!'; single_format_data(ble_bin_buffer, resp_error, err_code2); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); return false; } @@ -244,7 +244,7 @@ void param_error(const char *cmd ) resp_error[3] = '!'; single_format_data(ble_bin_buffer, resp_error, err_code3); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); } @@ -253,10 +253,8 @@ void quest_error(const char *cmd ) char resp_error[4]; const char pass_init[6] = "123456"; if( (cmd[0] == '*') && (cmd[1] == '*') && (cmd[2] == '*') && (cmd[3] == '*')){ - if(eeprom_write_encrypted(0x0020, (uint8_t *)pass_init, 6)!= NRF_SUCCESS) - { - DBG_PRINTF("ERR!!! EEP_passkey 6\r\n\r\n");; - } + memcpy(m_config.static_passkey, pass_init, 6); + config_save(); resp_error[0] = '*'; @@ -264,7 +262,7 @@ void quest_error(const char *cmd ) resp_error[2] = cmd[2]; // 3rd letter (index 2) resp_error[3] = '*'; single_format_data(ble_bin_buffer, resp_error, err_code4); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); } else{ @@ -275,7 +273,7 @@ void quest_error(const char *cmd ) resp_error[3] = '!'; single_format_data(ble_bin_buffer, resp_error, err_code4); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); } } @@ -315,83 +313,7 @@ void quest_error(const char *cmd ) // } // } //} -ret_code_t eeprom_read_bool(uint16_t mem_address, bool *value_out) -{ - uint8_t raw; - ret_code_t ret = eeprom_read_byte(mem_address, &raw); - if (ret != NRF_SUCCESS) { - return ret; - } - - *value_out = (raw != 0); - return NRF_SUCCESS; -} -ret_code_t eeprom_init_values_read(void) - { - ret_code_t err_code; - //uint8_t *data_bond; - // Read 11 bytes from EEPROM - err_code = eeprom_read_decrypted(0x0030, (uint8_t *)SERIAL_NO, 12); - if (err_code != NRF_SUCCESS) - { - return err_code; - } - else - { - - DBG_PRINTF("\r\n SN:%s \r\n", SERIAL_NO); - - } - err_code = eeprom_read_decrypted(0x0020, (uint8_t *)m_static_passkey, 6); - if (err_code != NRF_SUCCESS) - { - return err_code; - } - else - { - - DBG_PRINTF("\r\n passkey-0 :%s \n", m_static_passkey); - - } - //err_code = eeprom_read_bytes(0x0060, data_bond,16); - err_code = eeprom_read_bool(0x0060, &bond_data_delete); - if (err_code != NRF_SUCCESS) - { - return err_code; - } - else - { - // bond_data_delete = data_bond[0]; - DBG_PRINTF("\r\n bond_data_delete :%d \n", bond_data_delete); - - } - - err_code = eeprom_read_byte(0x0065, &m_reset_status); - if (err_code != NRF_SUCCESS) - { - return err_code; - } - else - { - if(m_reset_status){ - //DBG_PRINTF("\r\n status :%d \n", m_reset_status); - } - } - DBG_PRINTF("m_life_cycle eprom read\n"); //ad cj - err_code = eeprom_read_uint32(0x0090, &m_life_cycle); - if (err_code != NRF_SUCCESS) - { - return err_code; - } - else - { - if(m_life_cycle){ - DBG_PRINTF("\r\n m_life_cycle :%1u \r\n", m_life_cycle); - } - } - - return NRF_SUCCESS; -} +/* eeprom_init_values_read() 삭제됨 — FDS config_load()가 동일 역할 수행 - jhChun 26.03.16 */ static void log_printf(const char *fmt, ...) @@ -428,7 +350,7 @@ void received_command_process (uint8_t const *data_array, which_cmd_t cmd_t, uin if (!parser_initialized) { // Setup platform interface g_plat.log = log_printf; // printf - g_plat.tx_bin = binary_tx_handler; + g_plat.tx_bin = dr_binary_tx_safe; g_plat.crc_check = true; // CRC g_log_enable = true; @@ -471,7 +393,7 @@ void received_command_process (uint8_t const *data_array, which_cmd_t cmd_t, uin resp_error[3] = '!'; single_format_data(ble_bin_buffer, resp_error, err_code6); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); return ; } else if(processing == true) @@ -588,7 +510,7 @@ if((scmd.tag[0] == 's')&&(scmd.tag[1] == 't')&&(scmd.tag[2] == 'a')&&(scmd.tag[3 } else if(cmd_t == CMD_BLE) { single_format_data(ble_bin_buffer, "rta:", scmd.value0); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); } } @@ -617,7 +539,7 @@ else if((scmd.tag[0] == 's')&&(scmd.tag[1] == 't')&&(scmd.tag[2] == 'r')&&(scmd. single_format_data(ble_bin_buffer, "rtr:", (uint8_t)device_status); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); } } @@ -684,7 +606,7 @@ else if((scmd.tag[1] == 's') && (scmd.tag[2] == 'q')){ // Device power off } else if(cmd_t == CMD_BLE) { single_format_data(ble_bin_buffer, "rsq:", scmd.value0); - binary_tx_handler(ble_bin_buffer,2); + dr_binary_tx_safe(ble_bin_buffer,2); // sprintf(ble_tx_buffer, "Tq\r\n"); // data_tx_handler(ble_tx_buffer); } @@ -701,16 +623,14 @@ else if((scmd.tag[1] == 's') && (scmd.tag[2] == 'r')){ // Bond Info Delete DBG_PRINTF("Tr\r\n\r\n"); } else if(cmd_t == CMD_BLE) { single_format_data(ble_bin_buffer, "rsr:", scmd.value0); - binary_tx_handler(ble_bin_buffer,2); + dr_binary_tx_safe(ble_bin_buffer,2); } bond_data_delete = true; - eeprom_write_byte(0x0060, (uint8_t)bond_data_delete); - - //m_config.reset_status = 2; + m_config.bond_data_delete = (uint8_t)bond_data_delete; m_reset_status = 2; - eeprom_write_byte(0x0065, m_reset_status); - //config_save(); + m_config.reset_status = m_reset_status; + config_save(); nrf_delay_ms(5); go_NVIC_SystemReset = true; main_timer_start(); @@ -726,14 +646,14 @@ else if((scmd.tag[1] == 's') && (scmd.tag[2] == 's')){ //Device reset(Reboot) DBG_PRINTF("Ts\r\n\r\n"); } else if(cmd_t == CMD_BLE) { single_format_data(ble_bin_buffer, "rss:", scmd.value0); - binary_tx_handler(ble_bin_buffer,2); + dr_binary_tx_safe(ble_bin_buffer,2); } go_NVIC_SystemReset = true; //m_config.reset_status = 2; m_reset_status = 2; - eeprom_write_byte(0x0065, m_reset_status); - // config_save(); + m_config.reset_status = m_reset_status; + config_save(); nrf_delay_ms(5); go_NVIC_SystemReset = true; main_timer_start(); @@ -745,7 +665,7 @@ else if((scmd.tag[1] == 's') && (scmd.tag[2] == 't')){ // Auto Gain Control DBG_PRINTF("Ready\r\n\r\nREADY\r\n"); } else if(cmd_t == CMD_BLE) { single_format_data(ble_bin_buffer, "rst:", scmd.value0); - binary_tx_handler(ble_bin_buffer,2); + dr_binary_tx_safe(ble_bin_buffer,2); } @@ -759,7 +679,7 @@ else if(0 && (scmd.tag[1] == 's') && (scmd.tag[2] == 'v')){ // Auto Gain Cont DBG_PRINTF("%s\r\n",DEVICE_VERSION); } else if(cmd_t == CMD_BLE) { ascii_format_data(ble_bin_buffer, "rsv:", DEVICE_VERSION,12); - binary_tx_handler(ble_bin_buffer,8); + dr_binary_tx_safe(ble_bin_buffer,8); //test_eeprom_page_rw(); } @@ -779,7 +699,7 @@ else if(0 && (scmd.tag[1] == 's') && (scmd.tag[2] == 'z')){ config_save(); DBG_PRINTF("[ssz] S/N=%s saved to FDS\r\n", m_config.serial_no); ascii_format_data(ble_bin_buffer, "rsz:", scmd.value_ascii,12); - binary_tx_handler(ble_bin_buffer,8); + dr_binary_tx_safe(ble_bin_buffer,8); } else{ DBG_PRINTF("ERR!!! Serial_number 12\r\n\r\n"); @@ -796,42 +716,16 @@ else if((scmd.tag[1] == 'p') && (scmd.tag[2] == 'z')){ //Write, passkey { return; } - uint8_t tx_data[EEPROM_PAGE_SIZE]; - uint8_t rx_data[EEPROM_PAGE_SIZE]; - uint8_t raw_data[EEPROM_PAGE_SIZE]; if(cmd_t == CMD_UART) { DBG_PRINTF("Tz0\r\n\r\n"); - } else if(cmd_t == CMD_BLE) { + } else if(cmd_t == CMD_BLE) { + memcpy(m_static_passkey, scmd.value_ascii, 6); + memcpy(m_config.static_passkey, m_static_passkey, 6); + config_save(); + DBG_PRINTF("Passkey saved: %.6s\n", m_static_passkey); - - //memcpy(SERIAL_NO, scmd.value_ascii, 6); - //eeprom_write_bytes(uint16_t mem_address, const uint8_t *data, size_t length) - for (uint8_t i=0 ; i<6 ;i++) - { - tx_data[i] = (uint8_t)(scmd.value_ascii[i]); - } - - - if(eeprom_write_encrypted(0x0020, tx_data, 6)!= NRF_SUCCESS) - { - DBG_PRINTF("ERR!!! EEP_passkey 6\r\n\r\n");; - } - - if(eeprom_read_bytes(0x0020, raw_data, 6)!= NRF_SUCCESS) - { - DBG_PRINTF("ERR!!! EEP_passkey 6\r\n\r\n");; - } - - nrf_delay_ms(10); - DBG_PRINTF("encrypted: %s\n", raw_data); - if(eeprom_read_decrypted(0x0020, rx_data, 6)!= NRF_SUCCESS) - { - DBG_PRINTF("ERR!!! EEP_passkey 6\r\n\r\n");; - } - DBG_PRINTF("Decrypted: %s\n", rx_data); - ascii_format_data(ble_bin_buffer, "rpz:", scmd.value_ascii,6); - binary_tx_handler(ble_bin_buffer,5); + dr_binary_tx_safe(ble_bin_buffer,5); } @@ -852,30 +746,12 @@ else if((scmd.tag[1] == 'p') && (scmd.tag[2] == 'z')){ //Write, passkey // sqz else if((scmd.tag[1] == 'q') && (scmd.tag[2] == 'z')){ // Read, Serial Number - uint8_t rx_data[EEPROM_PAGE_SIZE]; - if(cmd_t == CMD_UART) { DBG_PRINTF("Tz1,%s\r\n\r\n", SERIAL_NO); - } else if(cmd_t == CMD_BLE) { - - hw_i2c_init_once(); - if(eeprom_read_decrypted(0x0020, rx_data, 6)!= NRF_SUCCESS) - { - DBG_PRINTF("ERR!!! EEP_Serial_number 12\r\n\r\n");; - } - DBG_PRINTF("Decrypted: %s\n", rx_data); -// if (eeprom_read_bytes(0x0030 , rx_data ,12) !=NRF_SUCCESS) -// { -// DBG_PRINTF("ERR!!! EEP_Serial_number 12\r\n\r\n"); -// } -// sprintf(ble_tx_buffer, "Tz1,%s\r\n", m_config.serial_number); -// data_tx_handler(ble_tx_buffer); - for (uint8_t i=0 ; i<6 ;i++) - { - (m_static_passkey[i]) = (char)rx_data[i] ; - } + } else if(cmd_t == CMD_BLE) { + memcpy(m_static_passkey, m_config.static_passkey, 6); ascii_format_data(ble_bin_buffer, "rqz:", m_static_passkey,6); - binary_tx_handler(ble_bin_buffer,5); + dr_binary_tx_safe(ble_bin_buffer,5); } } @@ -886,7 +762,7 @@ else if(0 && (scmd.tag[1] == 'r') && (scmd.tag[2] == 'z')){ } else if(cmd_t == CMD_BLE) { memcpy(SERIAL_NO, m_config.serial_no, 12); ascii_format_data(ble_bin_buffer, "rrz:", SERIAL_NO, 12); - binary_tx_handler(ble_bin_buffer, 8); + dr_binary_tx_safe(ble_bin_buffer, 8); } #if 0 // ===== EEPROM start block ===== @@ -941,7 +817,7 @@ else if(0 && (scmd.tag[1] == 'r') && (scmd.tag[2] == 'z')){ // } else if(cmd_t == CMD_BLE) { //// sprintf(ble_tx_buffer, "Tz3,%s\r\n",read_data // ascii_format_data(ble_bin_buffer, "rcz:", "ok",3); -// binary_tx_handler(ble_bin_buffer,5); +// dr_binary_tx_safe(ble_bin_buffer,5); //// data_tx_handler(ble_tx_buffer); // } @@ -969,7 +845,7 @@ else if(0 && (scmd.tag[1] == 'r') && (scmd.tag[2] == 'z')){ // // // format_data_byte(ble_bin_buffer, "rdz:", read_data,64); -// binary_tx_handler(ble_bin_buffer,34); +// dr_binary_tx_safe(ble_bin_buffer,34); // } @@ -981,26 +857,11 @@ else if(0 && (scmd.tag[1] == 'r') && (scmd.tag[2] == 'z')){ // sez else if((scmd.tag[1] == 'e') && (scmd.tag[2] == 'z')){ // Read, Serial Number - hw_i2c_init_once(); - - uint16_t write_data[64]; - - - for (int i = 0; i < 48; i++) { - write_data[i]= (uint16_t)(scmd.values[i*2+7] | (uint16_t)(scmd.values[i*2+6] << 8)); - } - - eeprom_write_uint16_array(scmd.value0,write_data,48); - - + /* AGC gain array — AD5272/MCP4725 HW 제거됨, 명령 비활성화 - jhChun 26.03.16 */ if(cmd_t == CMD_UART) { - DBG_PRINTF("rez,%s\r\n\r\n", scmd.value_ascii); - } else if(cmd_t == CMD_BLE) { - - - - format_data(ble_bin_buffer, "rez:", write_data,48); - binary_tx_handler(ble_bin_buffer,50); + DBG_PRINTF("sez: HW not present\r\n"); + } else if(cmd_t == CMD_BLE) { + param_error(scmd.tag); } } @@ -1016,26 +877,11 @@ else if((scmd.tag[1] == 'f') && (scmd.tag[2] == 'z')){ // Read, Ser // } else{ - - hw_i2c_init_once(); - uint16_t read_data[64]; - //uint8_t EEPread_data[64]; - - - eeprom_read_uint16_array(scmd.value0,read_data,48); //int16(48ea) DP Preset 0~6 -// for (int i = 0; i < 48; i++) { -// EEPread_data[i]= (uint8_t)(read_data[i]); -// } - - + /* AGC gain array — AD5272/MCP4725 HW 제거됨, 명령 비활성화 - jhChun 26.03.16 */ if(cmd_t == CMD_UART) { - DBG_PRINTF("ref,%s\r\n\r\n", scmd.value_ascii); - } else if(cmd_t == CMD_BLE) { - - - - format_data(ble_bin_buffer, "rfz:", read_data,48); - binary_tx_handler(ble_bin_buffer,50); + DBG_PRINTF("sfz: HW not present\r\n"); + } else if(cmd_t == CMD_BLE) { + param_error(scmd.tag); } } } @@ -1046,7 +892,7 @@ else if(0 && (scmd.tag[1] == 'i') && (scmd.tag[2] == 'z')){ } else if(cmd_t == CMD_BLE) { memcpy(HW_NO, m_config.hw_no, 12); ascii_format_data(ble_bin_buffer, "riz:", HW_NO, 12); - binary_tx_handler(ble_bin_buffer, 8); + dr_binary_tx_safe(ble_bin_buffer, 8); } } // shz - Write HW Number (FDS only) — DISABLED: use mwh? in pc_firm/parser.c @@ -1063,7 +909,7 @@ else if(0 && (scmd.tag[1] == 'h') && (scmd.tag[2] == 'z')){ config_save(); DBG_PRINTF("[shz] HW=%s saved to FDS\r\n", m_config.hw_no); ascii_format_data(ble_bin_buffer, "rhz:", scmd.value_ascii,12); - binary_tx_handler(ble_bin_buffer,8); + dr_binary_tx_safe(ble_bin_buffer,8); } else{ DBG_PRINTF("ERR!!! HW_NO 12\r\n\r\n"); @@ -1091,10 +937,10 @@ else if((scmd.tag[1] == 'x') && (scmd.tag[2] == 'z')){ // Set the delay for if(cmd_t == CMD_UART) { DBG_PRINTF("rxz\r\n\r\n"); } else if(cmd_t == CMD_BLE) { - hw_i2c_init_once(); - eeprom_write_uint32(0x0090, m_life_cycle); + m_config.life_cycle = m_life_cycle; + config_save(); format_data(ble_bin_buffer, "rxz:", result_data,2); - binary_tx_handler(ble_bin_buffer,4); + dr_binary_tx_safe(ble_bin_buffer,4); } }else{ if(cmd_t == CMD_UART) { @@ -1121,7 +967,7 @@ else if((scmd.tag[1] == 'y') && (scmd.tag[2] == 'z')){ // else { - eeprom_read_uint32(0x0090, &m_life_cycle); //thnk cj + m_life_cycle = m_config.life_cycle; result_data[0] = (uint16_t)(m_life_cycle >> 16); result_data[1] = (uint16_t)(m_life_cycle & 0xFFFF); @@ -1132,7 +978,7 @@ else if((scmd.tag[1] == 'y') && (scmd.tag[2] == 'z')){ // } else if(cmd_t == CMD_BLE) { format_data(ble_bin_buffer, "ryz:", result_data,4); - binary_tx_handler(ble_bin_buffer,4); + dr_binary_tx_safe(ble_bin_buffer,4); } } @@ -1145,7 +991,7 @@ else if((scmd.tag[1] == 'y') && (scmd.tag[2] == 'z')){ // DBG_PRINTF("ERR!!! UART Command Failed, %c%c%c%c\r\n",data_array[0], data_array[1], data_array[2], data_array[3]); } else if(cmd_t == CMD_BLE) { single_format_data(ble_bin_buffer, "err!", err_code5); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); diff --git a/project/ble_peripheral/ble_app_bladder_patch/cmd_parse.h b/project/ble_peripheral/ble_app_bladder_patch/cmd_parse.h index ca89255..cb1fdf8 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/cmd_parse.h +++ b/project/ble_peripheral/ble_app_bladder_patch/cmd_parse.h @@ -33,8 +33,6 @@ #include "math.h" #include "crc16.h" //add 25.04.23 #include "nrf_ble_lesc.h" -#include "cat_interface.h" -#include "ir_i2c.h" #include "nrf_crypto.h" #include "nrf_pwr_mgmt.h" #include @@ -43,23 +41,10 @@ #include "main.h" #include "app_raw_main.h" //0117 #include "main_timer.h" -#include "ad5272_i2c.h" -#include "ada2200_spi.h" #include "power_control.h" #include "tmp235_q1.h" -#include "mcp4725_i2c.h" -#include "measurements.h" //#include "fstorage.h" #include "battery_saadc.h" -#include "mcp4725_adc.h" -#include "meas_pd_voltage_simple.h" -#include "meas_pd_voltage_half.h" -#include "meas_pd_voltage_full.h" -#include "full_agc.h" -//#include "meas_pd_voltage_custom.h" -#include "meas_pd_imm.h" - -#include "meas_pd_48.h" typedef struct { char tag[5]; // Null-terminated 4-char command uint16_t value0; // Data value @@ -82,7 +67,6 @@ bool is_valid_serial_no(const char *serial); bool is_valid_passkey(const char *passkey); -ret_code_t eeprom_init_values_read(void); bool crc16_check(uint8_t const * p_data, uint32_t data_len, uint16_t expected_crc); bool crc16_check_packet(uint8_t const * packet, uint32_t packet_len); diff --git a/project/ble_peripheral/ble_app_bladder_patch/debuf_print.h b/project/ble_peripheral/ble_app_bladder_patch/debuf_print.h deleted file mode 100644 index 8a20dd6..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/debuf_print.h +++ /dev/null @@ -1,14 +0,0 @@ -// file: debug_print.h -#ifndef DEBUG_PRINT_H -#define DEBUG_PRINT_H - -#define ENABLE_PRINTF 1 // Set to 0 to disable globally - -#if ENABLE_PRINTF - #include - #define DBG_PRINTF(...) printf(__VA_ARGS__) -#else - #define DBG_PRINTF(...) // Do nothing -#endif - -#endif // DEBUG_PRINT_H diff --git a/project/ble_peripheral/ble_app_bladder_patch/fstorage.c b/project/ble_peripheral/ble_app_bladder_patch/fstorage.c index 4c65ba2..f8376a8 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/fstorage.c +++ b/project/ble_peripheral/ble_app_bladder_patch/fstorage.c @@ -78,6 +78,9 @@ void fds_default_value_set(void) /* Measurement parameters */ m_config.pd_adc_cnt = 8; m_config.pd_delay_us = 8000; + + /* Device usage count */ + m_config.life_cycle = 0; } @@ -106,19 +109,19 @@ static void fds_evt_handler( fds_evt_t const *p_evt ) { fds_flag_write = false; - if(go_device_power_off == true) { - /* After flash writing completed, System Power Off */ - device_power_off(); - } - if(go_sleep_mode_enter == true) { - /* After flash writing completed, System go to Sleep Mode */ - sleep_mode_enter(); - } - if(go_NVIC_SystemReset == true) { - /* After flash writing completed, System Reset */ - DBG_PRINTF("Off FDS_EVENT\r\n"); - NVIC_SystemReset(); - } + if(go_device_power_off == true) { + /* After flash writing completed, System Power Off */ + device_power_off(); + } + if(go_sleep_mode_enter == true) { + /* After flash writing completed, System go to Sleep Mode */ + sleep_mode_enter(); + } + if(go_NVIC_SystemReset == true) { + /* After flash writing completed, System Reset */ + DBG_PRINTF("Off FDS_EVENT\r\n"); + NVIC_SystemReset(); + } } break; diff --git a/project/ble_peripheral/ble_app_bladder_patch/fstorage.h b/project/ble_peripheral/ble_app_bladder_patch/fstorage.h index 4fcb89b..e5b8129 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/fstorage.h +++ b/project/ble_peripheral/ble_app_bladder_patch/fstorage.h @@ -25,7 +25,8 @@ typedef struct int8_t reset_status; /* 1B - Reset status */ uint8_t pd_adc_cnt; /* 1B - ADC sample count */ uint16_t pd_delay_us; /* 2B - PD delay (us) */ -} config_data_t; /* Total: 41 bytes - FDS에 저장하는 디바이스 설정 */ + uint32_t life_cycle; /* 4B - Device usage count (sxz/syz command) */ +} config_data_t; /* Total: 45 bytes - FDS에 저장하는 디바이스 설정 */ extern config_data_t m_config; diff --git a/project/ble_peripheral/ble_app_bladder_patch/full_agc.c b/project/ble_peripheral/ble_app_bladder_patch/full_agc.c deleted file mode 100644 index 70ed0ec..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/full_agc.c +++ /dev/null @@ -1,1033 +0,0 @@ -/******************************************************************************* - TEST medi50 Dec 23 - ******************************************************************************/ -#include "sdk_common.h" - -#include -#include -#include -#include -#include -#include "nrf.h" -#include "boards.h" -#include "app_error.h" -#include "nrf_drv_saadc.h" -#include "nrfx_gpiote.h" // -#include "nrf_drv_ppi.h" // -#include "app_timer.h" -#include "nrf_drv_timer.h" -#include "nrf_delay.h" -//#include "fstorage.h" -#include "measurements.h" -#include "main_timer.h" -#include "battery_saadc.h" -#include "main.h" -#include "full_agc.h" -#include "mcp4725_i2c.h" -#include "ad5272_i2c.h" -#include "ble_nus.h" -#include "cat_interface.h" -#include -#include "debug_print.h" -#include "i2c_manager.h" //add cj 25/10/12 -#if FEATURE_AGC_FLOAT -#define FULL_AGC_REF_VOLTAGE_IN_MILLIVOLTS 600.0f /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ -#define FULL_AGC_PRE_SCALING_COMPENSATION 6.0f /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/ -#define FULL_AGC_ADC_RES_10BITS 1024.0f /**< Maximum digital value for 10-bit ADC conversion. */ -#else - -#define FULL_AGC_REF_VOLTAGE_IN_MILLIVOLTS 600 /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ -#define FULL_AGC_PRE_SCALING_COMPENSATION 6 /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/ -#define FULL_AGC_ADC_RES_10BITS 1024 /**< Maximum digital value for 10-bit ADC conversion. */ -#endif -#define LED_NUM 24 -/**@brief Macro to convert the result of ADC conversion in millivolts. - * - * @param[in] ADC_VALUE ADC result. - * - * @retval Result converted to millivolts. - */ -#define FULL_AGC_VOUT_IN_MILLI_VOLTS(ADC_VALUE)\ - ((((ADC_VALUE) * FULL_AGC_REF_VOLTAGE_IN_MILLIVOLTS) / FULL_AGC_ADC_RES_10BITS) * FULL_AGC_PRE_SCALING_COMPENSATION) -#define DAC_MIN 125 -#define DAC_MAX 1365 -extern uint16_t led_pd_dac_v[LED_NUM]; -extern volatile bool processing; -uint8_t full_agc_LED_list[48]; -uint8_t full_agc_PD_list[1]; - -//uint8_t full_agc_LED_a[25] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}; -//uint8_t full_agc_LED_a[24] = {0,1,2,3,4,5,10,11,12,13,14,15,20,21,22,23,24,25,30,31,32,33,34,35}; -uint8_t full_agc_LED_a[24] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23}; -uint8_t full_agc_PD_a[1] = {0}; - -//const uint8_t full_agc_LED_b[24] = {40,41,42,43,44,45,50,51,52,53,54,55,60,61,62,63,64,65,70,71,72,73,74,75}; -const uint8_t full_agc_LED_b[24] = {24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; -uint8_t full_agc_PD_b[1] = {1}; - - -//const uint8_t full_agc_LED_c[48] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; -//uint8_t full_agc_PD_c[1] = {2}; - - - -static int8_t LED_NO = 24; -static int8_t pd_no = -1; -static int8_t led_no = -1; - -#define SAMPLES_IN_BUFFER 4 -static nrf_saadc_value_t full_agc_buf[2][SAMPLES_IN_BUFFER]; -//static nrf_saadc_value_t full_agc_buf; //origin - -bool full_agc_a_start = false; -bool full_agc_b_start = false; -bool full_agc_c_start = false; - -bool full_agc_completed = false; - - -APP_TIMER_DEF(m_full_agc_loop_timer_id); -#define FULL_AGC_LOOP_INTERVAL 2 //4 - -APP_TIMER_DEF(m_full_agc_send_timer_id); -// -#if FEATURE_DELAY -#define FULL_AGC_SEND_INTERVAL 500 -#else -#define FULL_AGC_SEND_INTERVAL 100 -#endif -#if FEATURE_AGC_FLOAT -static double agc_read_h = 0; -static double agc_read_l = 0; -static double agc_read_ref = 0; -static double m_full_agc_in_milli_volts = 0.0f; -#else -static uint16_t agc_read_h = 0; -static uint16_t agc_read_l = 0; -static uint16_t agc_read_ref = 0; -static uint16_t m_full_agc_in_milli_volts = 0; -#endif -static uint16_t cnt_js = 0;// skip when 1~3 -static bool agc_mode = false; -static uint16_t array_buff[48] = {0,}; -static uint16_t idx = 0; -static uint8_t order_cnt =0; -//uint16_t agc_read_v[PD_NUM][LED_NUM] = {0,}; -//uint16_t agc_read_v[LED_NUM] = {1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, /* PD0 */ -//000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000}; - -uint16_t agc_read_v[LED_NUM] = {1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000}; /* PD0 */ //24 cj edit 25/10/30 - - - - -uint16_t agc_A_0[LED_NUM] = {1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, /* PD0 */ -}; -uint16_t agc_A_1[LED_NUM] = {1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, /* PD1 */ -}; -uint16_t agc_A_2[LED_NUM] = {1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, /* MOD1 */ -}; - -uint16_t agc_B_0[LED_NUM] = {1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, /* PD1\0 */ -}; -uint16_t agc_B_1[LED_NUM] = {1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, /* PD1 */ -}; -uint16_t agc_B_2[LED_NUM] = {1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, /* MOD1 */ -}; - - -extern which_cmd_t cmd_type_t; - -char agc_tx_buffer[BLE_NUS_MAX_DATA_LEN]; - -char agc_tx_buffer_r[BLE_NUS_MAX_DATA_LEN]; - -bool agc_ble_send_order = false; - -extern volatile bool ble_connection_st; - -uint8_t agc_bin_buffer[BLE_NUS_MAX_DATA_LEN]; -//static nrf_ppi_channel_t m_ppi_channel; // - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ - -//void format_data(uint16_t *buffer, const char *tag, const uint16_t *data_array, size_t length) { -// // Store the tag as ASCII values in the buffer -// size_t tag_length = strlen(tag); -// uint16_t tag1 = (uint16_t)(tag[0])+(uint16_t)(tag[1]*256); -// uint16_t tag2 = (uint16_t)(tag[2])+(uint16_t)(tag[3]*256); -//// for (size_t i = 0; i < tag_length && i < 4; i++) { // Adjust according to the length of the tag -//// buffer[i] = (uint16_t)tag[i]; // Store ASCII value of each character -//// } -// buffer[0] = tag1; -// buffer[1] = tag2; -// -// // Append data values after the tag -// for (size_t i = 0; i < length; i++) { -// buffer[i +2] = data_array[i]; -// } -//} - -static void full_agc_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* ADC_GAIN reading */ -{ - - uint16_t min_data = 0; - //uint8_t re_i =0; - if (p_event->type == NRF_DRV_SAADC_EVT_DONE) - { - - uint32_t err_code; - - - // adc_result[0] = p_event->data.done.p_buffer[0]; -// adc_result[1] = p_event->data.done.p_buffer[1]; -// adc_result[2] = p_event->data.done.p_buffer[2]; -// adc_result[3] = p_event->data.done.p_buffer[3]; - //adc_result = p_event->data.done.p_buffer; - err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER); - // DBG_PRINTF("check\r\n"); - APP_ERROR_CHECK(err_code); - - /*m_full_agc_in_milli_volts = FULL_AGC_VOUT_IN_MILLI_VOLTS(adc_result); - DBG_PRINTF("millivolt,%d,", FULL_AGC_VOUT_IN_MILLI_VOLTS(adc_result)); - DBG_PRINTF("%d,", FULL_AGC_VOUT_IN_MILLI_VOLTS(adc_result1)); - DBG_PRINTF("%d,", FULL_AGC_VOUT_IN_MILLI_VOLTS(adc_result2)); - DBG_PRINTF("%d,", FULL_AGC_VOUT_IN_MILLI_VOLTS(adc_result3));*/ - - for(uint8_t i=0; i < SAMPLES_IN_BUFFER ; i++) { - - min_data+=p_event->data.done.p_buffer[i]; - - - } - //adc_result[0]=p_event->data.done.p_buffer; - //DBG_PRINTF("%d,%d\r\n", FULL_AGC_VOUT_IN_MILLI_VOLTS(p_event->data.done.p_buffer[0]),FULL_AGC_VOUT_IN_MILLI_VOLTS(p_event->data.done.p_buffer[SAMPLES_IN_BUFFER-1])); - m_full_agc_in_milli_volts = (uint16_t)(FULL_AGC_VOUT_IN_MILLI_VOLTS(min_data)*0.25); - //m_full_agc_in_milli_volts = min_data; - //DBG_PRINTF("%d\r\n", m_full_agc_in_milli_volts); // - /*if(m_full_agc_in_milli_volts<500 ) - { - m_full_agc_in_milli_volts = FULL_AGC_VOUT_IN_MILLI_VOLTS(adc_result); - cnt_js++; - DBG_PRINTF("millivolt2 %d\r\n", m_full_agc_in_milli_volts); - }*/ - - - } -} - -/** - * 2025-12-09 redesigned by Charles KWON - * @brief Full AGC (Automatic Gain Control) Measurement State Machine - * - * Performs LED-PD gain calibration across all 48 LED channels. - * Called periodically by app_timer. - * - * Process: - * 1. Turn on LED and PD sequentially - * 2. Measure high/low voltage with AGC mode toggle - * 3. Calculate DAC value and store gain - * 4. Move to next LED-PD pair - * 5. Send results via BLE/UART and save to EEPROM - * - * LED-PD Configuration: - * - LED_NO (48): Total LED channels - * - PD_NO (2): Photodiode channels per LED - */ -static void full_agc_measurement(void) -{ - /* State flags for multi-step processing */ - static bool mode_behind = false; - static bool sampling_behind = false; - static bool agc_processing_behind = false; - - /* DAC calculation variables */ - static double Vref = 3.3f; /* Reference voltage (same as Vdd) */ - static double dac_value_h = 0.0f; /* High mode DAC value */ - static double dac_value_l = 0.0f; /* Low mode DAC value */ - -#if FEATURE_DETAIL_VALUE_AGC - static double avg_num = 0.0f; /* Average for statistics */ -#endif - - static uint16_t dac_reg_h = 0; /* High mode DAC register */ - static uint16_t dac_reg_l = 0; /* Low mode DAC register */ - static uint16_t max_num = 0; /* Maximum difference value */ - static uint16_t zero_count = 0; /* Zero count for statistics */ - static uint16_t sum_num = 0; /* Sum for average calculation */ - static uint16_t diff_volt = 0; /* Voltage difference (H - L) */ - - /* Delay counter for non-blocking wait */ - static int delay_ticks_counter = 0; - - /*======================================== - * Delay Wait Check (Non-blocking) - *========================================*/ - if (delay_ticks_counter > 0) { - delay_ticks_counter--; - // DBG_PRINTF("COUNTER ~108ms before part B...\r\n"); - return; - } - - /*======================================== - * Initial State: First LED-PD Setup - *========================================*/ - if (led_no == -1) { - led_no = 0; - pd_no = 0; - - led_on(full_agc_LED_list[led_no]); - pd_on(full_agc_PD_list[pd_no]); - // nrf_delay_ms(10); - - DBG_PRINTF("LED-1\r\n"); - delay_ticks_counter = 100; /* Wait ~100 ticks for stabilization */ - DBG_PRINTF("Finished part A. Pausing for ~108ms before part B...\r\n"); - return; - } - - /*======================================== - * Main Processing: LED 0-47 - *========================================*/ - if ((led_no >= 0) && (led_no <= 47)) { - - /*---------------------------------------- - * Step 1: AGC Mode Toggle - *----------------------------------------*/ - if (mode_behind == false) { - mode_behind = true; - - /* Toggle AGC mode (high/low) */ - if (agc_mode == false) { - agc_mode = true; - } else if (agc_mode == true) { - agc_mode = false; - } - -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("agc_mode [%d]\r\n", agc_mode); -#endif - AGC_GAIN_SW(agc_mode); - return; - } - - /*---------------------------------------- - * Step 2: ADC Sampling - *----------------------------------------*/ - if (sampling_behind == false) { - sampling_behind = true; - - ret_code_t err_code = nrf_drv_saadc_sample(); - // DBG_PRINTF("sample_cnt %d\r\n", cnt_js); - cnt_js++; - APP_ERROR_CHECK(err_code); - return; - } - - /*---------------------------------------- - * Step 3: AGC Processing - *----------------------------------------*/ - if (agc_processing_behind == false) { - - /*--- High Mode Processing ---*/ - if (agc_mode == true) { - - /* Check for zero reading - resample if needed */ - if (m_full_agc_in_milli_volts == 0) { -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("<1>ReSampling +++++ mode = %d, led_no = %d(%d), pd_no = %d(%d)\r\n", - agc_mode, led_no, full_agc_LED_list[led_no], pd_no, full_agc_PD_list[pd_no]); -#endif - agc_mode = false; - mode_behind = false; - sampling_behind = false; - return; - } - - /* Store high mode reading */ - agc_read_h = m_full_agc_in_milli_volts; - m_full_agc_in_milli_volts = 0.0f; - - /* Calculate DAC value: Dn = (Vout/Vref) x 4096 */ - dac_value_h = (((agc_read_h / Vref) * 4096.0f) / 1000.0f); /* Unit: mV */ - dac_reg_h = (uint16_t)(dac_value_h + 0.5f); /* Round to nearest integer */ - - // DBG_PRINTF("PD %d,%d,%d,%d\r\n", full_agc_LED_list[led_no], full_agc_PD_list[pd_no], agc_read_h, dac_reg_h); - -#if FEATURE_FOR_SCOPE - /* Scope trigger pulse */ - nrf_gpio_pin_set(ADC_CLK_18); - nrf_gpio_pin_clear(ADC_CLK_18); - nrf_gpio_pin_set(ADC_CLK_18); - nrf_gpio_pin_clear(ADC_CLK_18); -#endif - - /* Store DAC value to gain array */ - // AGC range limiting (commented out) - // if (dac_reg_h < DAC_MIN) { - // dac_reg_h = DAC_MIN; - // } else if (dac_reg_h > DAC_MAX) { - // dac_reg_h = DAC_MAX; - // } - led_pd_dac_v[full_agc_LED_list[led_no]] = dac_reg_h; - -#if FEATURE_DETAIL_VALUE_AGC -#if FEATURE_AGC_FLOAT - DBG_PRINTF("mode = %d, led_no = %d(%d), pd_no = %d(%d), \t%lf(mV)->DAC %d\r\n", - agc_mode, led_no, full_agc_LED_list[led_no], pd_no, full_agc_PD_list[pd_no], - agc_read_h, dac_reg_h); -#else - DBG_PRINTF("mode = %d, led_no = %d(%d), pd_no = %d(%d), \t%d(mV)->DAC %d\r\n", - agc_mode, led_no, full_agc_LED_list[led_no], pd_no, full_agc_PD_list[pd_no], - agc_read_h, dac_reg_h); -#endif -#endif - - /* Apply gain to MCP4725 DAC */ - sw_i2c_init_once(); // cj add - pd_gain_set(full_agc_LED_list[led_no]); - - mode_behind = false; - sampling_behind = false; - - /*--- Low Mode Processing ---*/ - } else if (agc_mode == false) { - - /* Check for zero reading - resample if needed */ - if (m_full_agc_in_milli_volts == 0) { -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("<2>ReSampling +++++ mode = %d, led_no = %d(%d), pd_no = %d(%d)\r\n", - agc_mode, led_no, full_agc_LED_list[led_no], pd_no, full_agc_PD_list[pd_no]); -#endif - agc_mode = true; - mode_behind = false; - sampling_behind = false; - // DBG_PRINTF("sample_cnt2 %d\r\n", cnt_js); - return; - } - - /* Store low mode reading */ - agc_read_l = m_full_agc_in_milli_volts; - m_full_agc_in_milli_volts = 0.0f; - - /* Calculate DAC value: Dn = (Vout/Vref) x 4096 */ - dac_value_l = (((agc_read_l / Vref) * 4096.0f) / 1000.0f); /* Unit: mV */ - dac_reg_l = (uint16_t)(dac_value_l + 0.5f); /* Round to nearest integer */ - -#if FEATURE_FOR_SCOPE - /* Scope trigger pulse */ - nrf_gpio_pin_set(ADC_CLK_18); - nrf_gpio_pin_clear(ADC_CLK_18); -#endif - - /* Store low mode value */ - agc_read_v[full_agc_LED_list[led_no]] = dac_reg_l; - - /* Calculate voltage difference (high - low) */ - agc_read_ref = fabsf(agc_read_h - agc_read_l); - diff_volt = (uint16_t)(agc_read_ref + 0.5f); - - // DBG_PRINTF("PD2 %d,%d,%d,%d\r\n", full_agc_LED_list[led_no], full_agc_PD_list[pd_no], agc_read_l, dac_reg_l); - - /* Store difference for analysis */ - array_buff[idx] = diff_volt; - idx++; - -#if FEATURE_DETAIL_VALUE_AGC -#if FEATURE_AGC_FLOAT - DBG_PRINTF("mode = %d, led_no = %d(%d), pd_no = %d(%d), \t%f(mV), \t\t\tDiff = %d\r\n\r\n", - agc_mode, led_no, full_agc_LED_list[led_no], pd_no, full_agc_PD_list[pd_no], - agc_read_l, diff_volt); -#else - DBG_PRINTF("mode = %d, led_no = %d(%d), pd_no = %d(%d), \t%d(mV), \t\t\tDiff = %d\r\n\r\n", - agc_mode, led_no, full_agc_LED_list[led_no], pd_no, full_agc_PD_list[pd_no], - agc_read_l, diff_volt); -#endif -#endif - agc_processing_behind = true; - } - - return; - } - - /*---------------------------------------- - * Step 4: Reset and Advance to Next - *----------------------------------------*/ - mode_behind = false; - sampling_behind = false; - agc_processing_behind = false; - - agc_mode = false; - dac_value_h = 0.0f; - dac_reg_h = 0; - diff_volt = 0; - - /*--- Advance PD Channel ---*/ - if (pd_no < PD_NO - 1) { - pd_no++; - pd_on(full_agc_PD_list[pd_no]); - // nrf_delay_ms(4); - // DBG_PRINTF("PD-1\r\n"); - } - /*--- Advance LED Channel ---*/ - else if (pd_no >= PD_NO - 1) { - pd_no = 0; - - if (led_no < LED_NO - 1) { - led_no++; - led_on(full_agc_LED_list[led_no]); - pd_on(full_agc_PD_list[pd_no]); - // nrf_delay_ms(100); - - /* Add delay at LED package boundary (every 6 LEDs) */ - if (full_agc_LED_list[led_no] % 6 == 0) { - delay_ticks_counter = 5; - DBG_PRINTF("LED_PACKAGE\r\n"); - } - DBG_PRINTF("LED+1\r\n"); - } - /*======================================== - * Final State: All LEDs Completed - *========================================*/ - else if (led_no >= LED_NO - 1) { - pd_no = -1; - led_no = -1; - -#if FEATURE_DETAIL_VALUE_AGC - /* Print LED-PD gain array */ - DBG_PRINTF("\r\nLED-PD Gain Array =\r\n"); - for (uint16_t i = 0; i < PD_NUM; i++) { - for (uint16_t j = 0; j < LED_NUM; j++) { - DBG_PRINTF("%d,\t", led_pd_dac_v[i][j]); - } - DBG_PRINTF("\r\n"); - } - DBG_PRINTF("\r\n"); -#endif - - /*--- Check BLE connection ---*/ - if (ble_connection_st == 0) { - full_agc_send_timer_stop(); - full_agc_end(); - DBG_PRINTF("Full AGC STOP 1\r\n"); - } - /*--- A Mode -> B Mode Transition ---*/ - else if (full_agc_a_start == true) { - full_agc_a_start = false; - full_agc_b_start = true; - full_agc_start(); - } - /*--- B Mode Complete ---*/ - else if (full_agc_b_start == true) { - full_agc_b_start = false; - // full_agc_c_start = true; - // full_agc_start(); - - full_agc_completed = true; - full_agc_end(); - - // C Mode (commented out) - // else if (full_agc_c_start == true) { - // full_agc_c_start = false; - // full_agc_completed = true; - // full_agc_end(); - -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("Full AGC, Completed!\r\n"); -#endif - - /*--- Calculate Statistics ---*/ - for (uint16_t i = 0; i < idx; i++) { -#if FEATURE_DETAIL_VALUE_AGC - if (i % 25 == 0) DBG_PRINTF("\r\n"); - DBG_PRINTF("%d, \t", array_buff[i]); -#endif - sum_num += array_buff[i]; - if (array_buff[i] == 0) zero_count++; - if (max_num < array_buff[i]) { - max_num = array_buff[i]; - } - } - -#if FEATURE_DETAIL_VALUE_AGC - avg_num = (double)sum_num / idx; - DBG_PRINTF("\r\n\r\n"); - DBG_PRINTF("Max_number = %d\r\n", max_num); - DBG_PRINTF("Avg_number = %.2f\r\n", avg_num); - DBG_PRINTF("Zero_count = %d\r\n", zero_count); - DBG_PRINTF("Zero_Percentage = %.2f%%\r\n", (double)zero_count / idx * 100); - DBG_PRINTF("\r\n"); -#endif - - /* Clear buffer */ - for (uint16_t i = 0; i < 48; i++) { - array_buff[i] = 0; - } -#if FEATURE_DETAIL_VALUE_AGC - avg_num = 0.0f; -#endif - max_num = 0; - zero_count = 0; - sum_num = 0; - idx = 0; - -#if FEATURE_DETAIL_VALUE_AGC - /* Print low mode values */ - DBG_PRINTF("agc_read_v = \r\n"); - for (uint16_t i = 0; i < PD_NUM; i++) { - for (uint16_t j = 0; j < LED_NUM; j++) { - DBG_PRINTF("%d, \t", agc_read_v[i][j]); - } - DBG_PRINTF("\r\n"); - } - DBG_PRINTF("\r\n"); -#endif - - /*======================================== - * Send Results via UART or BLE - *========================================*/ - if (cmd_type_t == CMD_UART) { - /* UART output */ - DBG_PRINTF("Tagc, "); - for (uint16_t j = 0; j < LED_NUM; j++) { - DBG_PRINTF("%d, ", led_pd_dac_v[j]); - } - DBG_PRINTF("\r\n"); - - // Extended UART output (commented out) - // for (uint16_t i = 0; i < PD_NUM; i++) { - // DBG_PRINTF("Tagc-B%d, ", i); - // for (uint16_t j = 0; j < LED_NUM; j++) { - // DBG_PRINTF("%d, ", agc_read_v[i][j]); - // } - // DBG_PRINTF("\r\n"); - // } - // DBG_PRINTF("\r\n"); - - } else if (cmd_type_t == CMD_BLE) { - /* BLE output */ - battery_timer_stop(); - - /* Copy gain values to transmit buffers */ - for (uint16_t j = 0; j < LED_NO; j++) { - agc_A_0[j] = led_pd_dac_v[j]; - } - for (uint16_t j = 0; j < LED_NO; j++) { - agc_A_1[j] = led_pd_dac_v[j + LED_NO]; - } - - // Text format output (commented out) - // sprintf(agc_tx_buffer, "send_process\r\n\r\n"); - // sprintf(agc_tx_buffer, "Tagc\t%d,\t%d,\t..."); - // sprintf(agc_tx_buffer, "Tagc-A0,\t%d,\t%d,\t..."); - // data_tx_handler(agc_tx_buffer); - // sprintf(agc_tx_buffer, "Tagc-A1,\t%d,\t%d,\t..."); - // data_tx_handler(agc_tx_buffer); - - /* Binary format: "rag:" + 48 x uint16 */ - format_data(agc_bin_buffer, "rag:", led_pd_dac_v, 96); - binary_tx_handler(agc_bin_buffer, 50); - - /* Debug: Print buffer hex */ - for (uint16_t i = 0; i < 50; i++) { - DBG_PRINTF("%02X ", agc_bin_buffer[i]); - } - DBG_PRINTF("\r\n"); - - /* Debug: Print values */ - DBG_PRINTF("Tagc,"); - for (uint16_t j = 0; j < LED_NUM; j++) { - DBG_PRINTF("%d, ", led_pd_dac_v[j]); - } - - /* Save to EEPROM */ - eeprom_control(OFF); - eeprom_write_uint16_array(0x0480, led_pd_dac_v, 48); - nrf_delay_ms(10); - // eeprom_control(ON); - // full_agc_send_timer_start(); - DBG_PRINTF("AGC_Gain Write!\r\n"); - } - } - } - } - } -} - - - - - -void full_agc_start(void) -{ - cnt_js=0; - if(full_agc_a_start == true) { - -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("\r\n===== Full_AGC_A start ====================\r\n"); - - DBG_PRINTF("LED : "); -#endif - - - - full_agc_PD_list[0] = full_agc_PD_a[0]; - - - //memcpy(full_agc_LED_a, full_agc_LED_a_init, sizeof(full_agc_LED_a_init)); - - for(uint8_t i =0; i < LED_NO; i++) { - full_agc_LED_list[i] = full_agc_LED_a[i]; - //full_agc_LED_list[i] = i+1; - -//#if FEATURE_DETAIL_VALUE_AGC - // DBG_PRINTF("%d ", full_agc_LED_list[i]); -//#endif - } - // DBG_PRINTF("led\r\n "); -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("\r\n"); - - DBG_PRINTF("PD : "); -#endif - //for(uint8_t i =0; i < PD_NO; i++) { - // full_agc_PD_list[i] = full_agc_PD_a[i]; -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("%d ", full_agc_PD_list[i]); -#endif - // } -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("\r\n\r\n"); -#endif - } - - else if(full_agc_b_start == true) { - -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("\r\n===== Full_AGC_B start ====================\r\n"); - - DBG_PRINTF("LED : "); -#endif - for(uint8_t i =0; i < LED_NO; i++) { - full_agc_LED_list[i] = full_agc_LED_b[i]; -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("%d ", full_agc_LED_list[i]); -#endif - - // DBG_PRINTF("%d ", full_agc_LED_list[i]); -//#endif - } -// DBG_PRINTF("b_led\r\n "); - -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("\r\n"); - - DBG_PRINTF("PD : "); -#endif - - full_agc_PD_list[0] = full_agc_PD_b[0]; - -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("\r\n\r\n"); -#endif - } - - - - - - pd_no = -1; - led_no = -1; - -} - - -void full_agc_end(void) -{ - -// -// for(uint8_t i =0; i < LED_NO; i++) { -// full_agc_LED_list[i] = 0; -// } - hw_i2c_init_once(); - full_agc_timer_stop(); - full_agc_uninit(); - - battery_timer_start(); - - led_off(99); - pd_off(99); - DBG_PRINTF("end_process\r\n\r\n"); - processing = false; - //config_save(); -} - - -void full_agc_adc_init(void) -{ - ret_code_t err_code = nrf_drv_saadc_init(NULL, full_agc_voltage_handler); - APP_ERROR_CHECK(err_code); - - nrf_saadc_channel_config_t config = - NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN6); /* FSA5157P6X Voltage Output Measurement */ - - err_code = nrf_drv_saadc_channel_init(0, &config); - APP_ERROR_CHECK(err_code); - -// err_code = nrf_drv_saadc_buffer_convert(&full_agc_buf,SAMPLES_IN_BUFFER); -// APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_buffer_convert(full_agc_buf[0],SAMPLES_IN_BUFFER); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_buffer_convert(full_agc_buf[1],SAMPLES_IN_BUFFER); - APP_ERROR_CHECK(err_code); - -} - - -void full_agc_uninit(void) -{ - nrf_drv_saadc_uninit(); - nrf_drv_saadc_channel_uninit(0); -} - - -void full_agc_loop(void * p_context) /* For x ms */ -{ - UNUSED_PARAMETER(p_context); - full_agc_measurement(); - -} - - -void full_agc_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_full_agc_loop_timer_id, APP_TIMER_TICKS(FULL_AGC_LOOP_INTERVAL), NULL)); -} - - -void full_agc_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_full_agc_loop_timer_id)); -} - - -void full_agc_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_full_agc_loop_timer_id, APP_TIMER_MODE_REPEATED, full_agc_loop)); -} - -void full_agc_mesurement_start(void) -{ - agc_ble_send_order = false; - full_agc_completed = false; - battery_timer_stop(); - order_cnt =0; - - full_agc_a_start = true; - for(uint8_t i =0; i < LED_NO; i++) { - DBG_PRINTF("%d ", full_agc_LED_list[i]); - } - DBG_PRINTF("led/r/n "); - - full_agc_start(); - nrf_delay_ms(5); - full_agc_adc_init(); - nrf_delay_ms(5); - full_agc_timer_start(); -} - - -void full_agc_send_loop(void * p_context) /* For x ms */ -{ - UNUSED_PARAMETER(p_context); - - static bool send_step = false; - - - full_agc_send_timer_stop(); - - if(send_step == false) { - if(order_cnt >= 6) { - order_cnt = 0; - send_step = true; - }else if(order_cnt < 6) { - - switch(order_cnt) { - case 0: - for(uint16_t j = 0; j < LED_NO; j++){ - agc_A_0[j] = led_pd_dac_v[j]; - agc_B_0[j] = agc_read_v[j]; - } - break; - - case 1: - for(uint16_t j = 0; j < LED_NO; j++){ - agc_A_1[j] = led_pd_dac_v[LED_NO+j]; - agc_B_1[j] = agc_read_v[LED_NO+j]; - } - break; - - case 2: - - break; - - - case 3: - break; - case 4: - break; - case 5: - break; - - default: - DBG_PRINTF("ERR!!!, Out of range <1>\r\n"); - break; - } - order_cnt++; - } - }else if(send_step == true) { - - if(order_cnt >= 6) { - if(ble_connection_st == 1) { - battery_timer_start(); - } - - order_cnt = 0; - send_step = false; - - - return; - - }else if(order_cnt < 3) { - - if(agc_ble_send_order == false) { - switch(order_cnt){ - case 0: - sprintf(agc_tx_buffer,"Tagc-A0,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", agc_A_0[0], agc_A_0[1], agc_A_0[2], agc_A_0[3], agc_A_0[4], agc_A_0[5], agc_A_0[6], agc_A_0[7], agc_A_0[8], agc_A_0[9], agc_A_0[10], agc_A_0[11], agc_A_0[12], agc_A_0[13], agc_A_0[14], agc_A_0[15], agc_A_0[16], agc_A_0[17], agc_A_0[18], agc_A_0[19], agc_A_0[20], agc_A_0[21], agc_A_0[22], agc_A_0[23]); - - - - break; - case 1: - break; - case 2: - sprintf(agc_tx_buffer, "Tagc-A1,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", agc_A_1[0], agc_A_1[1], agc_A_1[2], agc_A_1[3], agc_A_1[4], agc_A_1[5], agc_A_1[6], agc_A_1[7], agc_A_1[8], agc_A_1[9], agc_A_1[10], agc_A_1[11], agc_A_1[12], agc_A_1[13], agc_A_1[14], agc_A_1[15], agc_A_1[16], agc_A_1[17], agc_A_1[18], agc_A_1[19], agc_A_1[20], agc_A_1[21], agc_A_1[22], agc_A_1[23]); - break; - - - case 3: - break; - - - case 4: - break; - - case 5: - - break; - - - - -// case 3: -// sprintf(agc_tx_buffer, "Tagc-B%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", order_cnt, agc_B_0[0], agc_B_0[1], agc_B_0[2], agc_B_0[3], agc_B_0[4], agc_B_0[5], agc_B_0[6], agc_B_0[7], agc_B_0[8], agc_B_0[9], agc_B_0[10], agc_B_0[11], agc_B_0[12], agc_B_0[13], agc_B_0[14], agc_B_0[15], agc_B_0[16], agc_B_0[17], agc_B_0[18], agc_B_0[19], agc_B_0[20], agc_B_0[21], agc_B_0[22], agc_B_0[23], agc_B_0[24]); -// break; -// -// case 4: -// sprintf(agc_tx_buffer, "Tagc-B%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", order_cnt, agc_B_1[0], agc_B_1[1], agc_B_1[2], agc_B_1[3], agc_B_1[4], agc_B_1[5], agc_B_1[6], agc_B_1[7], agc_B_1[8], agc_B_1[9], agc_B_1[10], agc_B_1[11], agc_B_1[12], agc_B_1[13], agc_B_1[14], agc_B_1[15], agc_B_1[16], agc_B_1[17], agc_B_1[18], agc_B_1[19], agc_B_1[20], agc_B_1[21], agc_B_1[22], agc_B_1[23], agc_B_1[24]); -// break; -// -// case 5: -// sprintf(agc_tx_buffer, "Tagc-B%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", order_cnt, agc_B_2[0], agc_B_2[1], agc_B_2[2], agc_B_2[3], agc_B_2[4], agc_B_2[5], agc_B_2[6], agc_B_2[7], agc_B_2[8], agc_B_2[9], agc_B_2[10], agc_B_2[11], agc_B_2[12], agc_B_2[13], agc_B_2[14], agc_B_2[15], agc_B_2[16], agc_B_2[17], agc_B_2[18], agc_B_2[19], agc_B_2[20], agc_B_2[21], agc_B_2[22], agc_B_2[23], agc_B_2[24]); -// break; - - - default: - DBG_PRINTF("ERR!!!, Out of range <2>\r\n"); - break; - } - if(ble_connection_st == 0) { - full_agc_end(); - full_agc_send_timer_stop(); - DBG_PRINTF("Full AGC STOP 2\r\n"); - } - else{ - data_tx_handler(agc_tx_buffer); - - order_cnt++; - if(order_cnt == 10) { - agc_ble_send_order = true; - order_cnt = 0; - } - } - }else if(agc_ble_send_order == true) { -// switch(order_cnt){ -// case 0: -// sprintf(agc_tx_buffer, "Tagc-B%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", order_cnt, agc_B_0[0], agc_B_0[1], agc_B_0[2], agc_B_0[3], agc_B_0[4], agc_B_0[5], agc_B_0[6], agc_B_0[7], agc_B_0[8], agc_B_0[9], agc_B_0[10], agc_B_0[11], agc_B_0[12], agc_B_0[13], agc_B_0[14], agc_B_0[15], agc_B_0[16], agc_B_0[17], agc_B_0[18], agc_B_0[19], agc_B_0[20], agc_B_0[21], agc_B_0[22], agc_B_0[23], agc_B_0[24]); -// break; -// -// case 1: -// sprintf(agc_tx_buffer, "Tagc-B%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", order_cnt, agc_B_1[0], agc_B_1[1], agc_B_1[2], agc_B_1[3], agc_B_1[4], agc_B_1[5], agc_B_1[6], agc_B_1[7], agc_B_1[8], agc_B_1[9], agc_B_1[10], agc_B_1[11], agc_B_1[12], agc_B_1[13], agc_B_1[14], agc_B_1[15], agc_B_1[16], agc_B_1[17], agc_B_1[18], agc_B_1[19], agc_B_1[20], agc_B_1[21], agc_B_1[22], agc_B_1[23], agc_B_1[24]); -// break; -// -// case 2: -// sprintf(agc_tx_buffer, "Tagc-B%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", order_cnt, agc_B_2[0], agc_B_2[1], agc_B_2[2], agc_B_2[3], agc_B_2[4], agc_B_2[5], agc_B_2[6], agc_B_2[7], agc_B_2[8], agc_B_2[9], agc_B_2[10], agc_B_2[11], agc_B_2[12], agc_B_2[13], agc_B_2[14], agc_B_2[15], agc_B_2[16], agc_B_2[17], agc_B_2[18], agc_B_2[19], agc_B_2[20], agc_B_2[21], agc_B_2[22], agc_B_2[23], agc_B_2[24]); -// break; -// -// -// -// default: -// DBG_PRINTF("ERR!!!, Out of range <2>\r\n"); -// break; -// } - if(ble_connection_st == 0) { - full_agc_end(); - full_agc_send_timer_stop(); - //DBG_PRINTF("Full AGC STOP 3\r\n"); - } - else{ -// data_tx_handler(agc_tx_buffer); - - - order_cnt++; - - } - } - } - } - if(ble_connection_st == 0) { - - order_cnt = 0; - full_agc_send_timer_stop(); - // DBG_PRINTF("Full AGC STOP 4\r\n"); - } - else{ - full_agc_send_timer_start(); - - } -} - - -void full_agc_send_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_full_agc_send_timer_id, APP_TIMER_TICKS(FULL_AGC_SEND_INTERVAL), NULL)); -} - - -void full_agc_send_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_full_agc_send_timer_id)); -} - - -void full_agc_send_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_full_agc_send_timer_id, APP_TIMER_MODE_SINGLE_SHOT, full_agc_send_loop)); -} - diff --git a/project/ble_peripheral/ble_app_bladder_patch/full_agc.h b/project/ble_peripheral/ble_app_bladder_patch/full_agc.h deleted file mode 100644 index 72785bb..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/full_agc.h +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - * @file full_agc.h - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#ifndef _FULL_AGC_H__ -#define _FULL_AGC_H__ - -#include "sdk_common.h" - -#define PD_NO 1 -//#define LED_NO 50 - - -void full_agc_start(void); -void full_agc_end(void); -void full_agc_adc_init(void); -void full_agc_uninit(void); -void full_agc_loop(void * p_context); /* For x ms */ -void full_agc_timer_start(void); -void full_agc_timer_stop(void); -void full_agc_timer_init(void); -void full_agc_mesurement_start(void); - -void full_agc_send_loop(void * p_context); /* For x ms */ -void full_agc_send_timer_start(void); -void full_agc_send_timer_stop(void); -void full_agc_send_timer_init(void); -#endif /* _FULL_AGC_H__ */ - - diff --git a/project/ble_peripheral/ble_app_bladder_patch/i2c_manager.c b/project/ble_peripheral/ble_app_bladder_patch/i2c_manager.c index 57727a0..fc79152 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/i2c_manager.c +++ b/project/ble_peripheral/ble_app_bladder_patch/i2c_manager.c @@ -7,14 +7,41 @@ #include "debug_print.h" #include "nrf_delay.h" -#include "mcp4725_i2c.h" #include "nrf_drv_twi.h" -#include "cat_interface.h" +#include "nrfx_twi.h" +#include "boards.h" +#include "system_interface.h" + bool HW_I2C_FRQ = true; bool SW_I2C_FRQ = false; -/* 외부 EEPROM TWI 인스턴스 */ -extern const nrf_drv_twi_t m_eeprom; +#define TWI_INSTANCE 0 + +/* TWI (I2C) 하드웨어 인스턴스 : IMU 드라이버에서 사용 - jhChun 26.03.16 */ +const nrfx_twi_t m_twi = NRFX_TWI_INSTANCE(TWI_INSTANCE); + +/* TWI (I2C) 해제 - jhChun 26.03.16 */ +static void twi_uninitialize(void){ + nrfx_twi_disable(&m_twi); + nrfx_twi_uninit(&m_twi); +} + +/* TWI (I2C) 하드웨어 초기화 (SCL/SDA핀, 400kHz) - jhChun 26.03.16 */ +static void twi_initialize(void){ + ret_code_t err_code; + + const nrfx_twi_config_t twi_config = { + .scl = ICM42670_I2C_SCL_PIN, + .sda = ICM42670_I2C_SDA_PIN, + .frequency = NRF_TWI_FREQ_400K, + .interrupt_priority = APP_IRQ_PRIORITY_HIGH, + }; + + err_code = nrfx_twi_init(&m_twi, &twi_config, NULL, NULL); + APP_ERROR_CHECK(err_code); + + nrfx_twi_enable(&m_twi); +} /* -------------------------------------------------------------------------- */ /* HW (TWI) 초기화 */ @@ -39,7 +66,7 @@ void hw_i2c_init_once(void) } // 실제 HW 초기화 - eeprom_initialize(); + twi_initialize(); nrf_delay_ms(2); HW_I2C_FRQ = true; @@ -58,8 +85,8 @@ void sw_i2c_init_once(void) { //DBG_PRINTF("[I2C]HW→SW\r\n"); - nrf_drv_twi_disable(&m_eeprom); - nrf_drv_twi_uninit(&m_eeprom); + nrfx_twi_disable(&m_twi); + nrfx_twi_uninit(&m_twi); nrf_delay_ms(2); HW_I2C_FRQ = false; @@ -73,9 +100,8 @@ void sw_i2c_init_once(void) } // 실제 SW 초기화 - eeprom_uninitialize(); // TWI 라인 해제 + twi_uninitialize(); // TWI 라인 해제 nrf_delay_ms(1); - mcp4725_init(); // Port BangBang 방식 DAC init SW_I2C_FRQ = true; HW_I2C_FRQ = false; diff --git a/project/ble_peripheral/ble_app_bladder_patch/icm42670p/app_raw/app_raw.c b/project/ble_peripheral/ble_app_bladder_patch/icm42670p/app_raw/app_raw.c index 0c8d112..a0b7693 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/icm42670p/app_raw/app_raw.c +++ b/project/ble_peripheral/ble_app_bladder_patch/icm42670p/app_raw/app_raw.c @@ -290,7 +290,7 @@ void imu_callback(inv_imu_sensor_event_t *event) ssp_data[5] = (uint16_t)gyro[2]; format_data(imu_bin_buffer, "rsp:", ssp_data,12); printf("Tp%d,%d,%d,%d,%d,%d\r\n\r\n", accel[0], accel[1], accel[2], gyro[0], gyro[1], gyro[2]); - binary_tx_handler(imu_bin_buffer,8); + dr_binary_tx_safe(imu_bin_buffer,8); if(custom_add_data==true) { custom_add_data = false; @@ -405,7 +405,7 @@ int imu_read_direct(void) ssp_data[5] = (uint16_t)gyro[2]; format_data(imu_bin_buffer, "rsp:", ssp_data, 12); - binary_tx_handler(imu_bin_buffer, 8); + dr_binary_tx_safe(imu_bin_buffer, 8); /* Put IMU back to sleep: accel OFF + gyro OFF */ { diff --git a/project/ble_peripheral/ble_app_bladder_patch/icm42670p/app_raw/app_raw_main.c b/project/ble_peripheral/ble_app_bladder_patch/icm42670p/app_raw/app_raw_main.c index 1ee5ef0..d5ef99a 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/icm42670p/app_raw/app_raw_main.c +++ b/project/ble_peripheral/ble_app_bladder_patch/icm42670p/app_raw/app_raw_main.c @@ -22,7 +22,6 @@ #include "nrf_delay.h" #include "app_util_platform.h" -#include "meas_pd_48.h" #include #include "i2c_manager.h" /* -------------------------------------------------------------------------------------- diff --git a/project/ble_peripheral/ble_app_bladder_patch/icm42670p/system_interface.c b/project/ble_peripheral/ble_app_bladder_patch/icm42670p/system_interface.c index aca9e30..2500960 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/icm42670p/system_interface.c +++ b/project/ble_peripheral/ble_app_bladder_patch/icm42670p/system_interface.c @@ -20,7 +20,6 @@ #include "system_interface.h" #include "nrf_delay.h" -#include "meas_pd_48.h" /* I2C number and slave address for INV device */ #define ICM_I2C_ADDR 0x68 diff --git a/project/ble_peripheral/ble_app_bladder_patch/ir_i2c.c b/project/ble_peripheral/ble_app_bladder_patch/ir_i2c.c deleted file mode 100644 index 1e2cf45..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/ir_i2c.c +++ /dev/null @@ -1,168 +0,0 @@ -/******************************************************************************* - * @file ir_i2c.c - * @brief - ******************************************************************************/ - -/* board driver */ -#include -#include -#include - -#include -#include "nrf.h" -#include "app_error.h" -#include "boards.h" -#include "nrfx_gpiote.h" -#include "nrfx_twi.h" -#include "nrf_drv_twi.h" - -#include "nrf_delay.h" -#include "ir_i2c.h" -#include "debug_print.h" - -/* I2C number and slave address for DS39305272 */ -#define LED_1_I2C_ADDR 0x50 -#define AD5272_MAX_SERIAL_WRITE 16 - -int16_t read_from_DS3930 = 0; -uint16_t data_160_to_write = 0; -static volatile bool m_xfer_done = false; - -/* TWI instance. */ -//const nrfx_twi_t m_twi_ir = NRFX_TWI_INSTANCE(IR_I2C_INSTANCE); -const nrf_drv_twi_t m_twi_ir = NRF_DRV_TWI_INSTANCE(IR_I2C_INSTANCE); -//void twi_handler(nrfx_twi_evt_t const * p_event, void * p_context) -//{ -// m_xfer_done = true; -//} -//void ir_irq_init(void){ -// ret_code_t err_code; - -// /* Initialize int pin */ -// if (!nrfx_gpiote_is_init()) -// { -// err_code = nrfx_gpiote_init(); -// APP_ERROR_CHECK(err_code); -// } - -// nrfx_gpiote_in_config_t in_config = NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(true); -// in_config.pull = NRF_GPIO_PIN_PULLDOWN; - -// err_code = nrfx_gpiote_in_init(ADA2200_SYNCO_PIN, &in_config, NULL); -// APP_ERROR_CHECK(err_code); - -// nrfx_gpiote_in_event_enable(ADA2200_SYNCO_PIN, true); -//} - - -//void ir_irq_uninit(void){ - -// nrfx_gpiote_in_event_disable(ADA2200_SYNCO_PIN); -// nrfx_gpiote_in_uninit(ADA2200_SYNCO_PIN); -//} -void ir_i2c_uninit(void){ - nrf_drv_twi_disable(&m_twi_ir); - nrf_drv_twi_uninit(&m_twi_ir); -// -} - - -void ir_i2c_init(void){ - ret_code_t err_code; - - const nrf_drv_twi_config_t twi_ir_config = { - .scl = IR_I2C_SCL_PIN, - .sda = IR_I2C_SDA_PIN, - .frequency = NRF_DRV_TWI_FREQ_100K, - .interrupt_priority = APP_IRQ_PRIORITY_HIGH, - .clear_bus_init = false - }; - - err_code = nrf_drv_twi_init(&m_twi_ir, &twi_ir_config, NULL, NULL); - APP_ERROR_CHECK(err_code); - if (err_code != NRF_SUCCESS) { - DBG_PRINTF("TWI ir_irq_init Error."); - } - - nrf_drv_twi_enable(&m_twi_ir); -// ir_irq_init(); -} - - - - -uint8_t ir_command_read(uint8_t device_id, uint8_t address, uint8_t *data) -{ - uint8_t read_data = 0; - char adata[8]; - ret_code_t err_code; - //address = 1|(address<<1); - address = (address & 0xFF); - err_code = nrf_drv_twi_tx(&m_twi_ir, device_id, &address, 1, true); - if (err_code != NRF_SUCCESS) { - // Handle error - // return; - } - - err_code = nrf_drv_twi_rx(&m_twi_ir, device_id, data, 8); - if (err_code != NRF_SUCCESS) { - // Handle error - DBG_PRINTF("TWI read Error."); - return 0; - } - read_data = data[0]; - memcpy(adata,data,8); - // DBG_PRINTF("ir Data %x %x %x %x. \r\n", device_id, address, data[0], data[1]); - //DBG_PRINTF("ir Data read %s . \r\n", adata); - return read_data; -} - - - - - - -void ir_command_write(uint8_t device_id, uint8_t address, uint8_t data) -{ - //uint16_t data_to_write = 0; - - uint8_t buffer[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; - - address = (address & 0xFF); - - //buffer[0] = 0x00; - buffer[0] = (address); - buffer[1] =(data & 0xFF); -// buffer[2] = data1+1; -// buffer[3] = data1+2; -// buffer[4] = data1+3; -// buffer[5] = data1+4; -// buffer[6] = data1+5; - //memcpy(&buffer[1], data, length ); - - - ret_code_t err_code; - //err_code = nrf_drv_twi_tx(&m_twi_ir, device_id, 0x00, 1, false); - - err_code = nrf_drv_twi_tx(&m_twi_ir, device_id, buffer, 2, false); - - - DBG_PRINTF("ir Write Data %x %x %x %x. \r\n", device_id, buffer[0], buffer[1], buffer[2]); - - //err_code = nrf_drv_twi_tx(&m_twi_ir, device_id, buffer, 6, false); - if (err_code != NRF_SUCCESS) { - - DBG_PRINTF("TWI Error."); - - - } - -} - - - - - - - - diff --git a/project/ble_peripheral/ble_app_bladder_patch/ir_i2c.h b/project/ble_peripheral/ble_app_bladder_patch/ir_i2c.h deleted file mode 100644 index 16521e5..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/ir_i2c.h +++ /dev/null @@ -1,111 +0,0 @@ -/******************************************************************************* - * @file ir_i2c.h - * @date 2024-07-17 - ******************************************************************************/ - -#ifndef _IR_I2C_H_ -#define _IR_I2C_H_ - -#include "sdk_common.h" - -#include -#include "nrf.h" -#include "nrf_drv_gpiote.h" - -#define IR_I2C_INSTANCE 1 /**< I2C instance index. */ -//#define IR_I2C_INSTANCE 1 /**< I2C instance index. */ -//#define IR_I2C_SDA_PIN NRF_GPIO_PIN_MAP(0,10) -//#define IR_I2C_SCL_PIN NRF_GPIO_PIN_MAP(0,9) -#define IR_I2C_SDA_PIN NRF_GPIO_PIN_MAP(1,15) -#define IR_I2C_SCL_PIN NRF_GPIO_PIN_MAP(1,14) -/** - * COMMAND CONSTANTS - * Commands are 16-bit writes: bits 15:14 are 0s - * Bits 13:10 are the command value below - * Bits 9:0 are data for the command, but not all bits are used with all commands - */ - -// The NOP command is included for completeness. It is a valid I2C operation. -#define AD5272_COMMAND_NOP 0x00 // Do nothing. Why you would want to do this I don't know - -// write the 10 or 8 data bits to the RDAC wiper register (it must be unlocked first) -#define AD5272_RDAC_WRITE 0x01 - -#define AD5272_RDAC_READ 0x02 // read the RDAC wiper register - -#define AD5272_50TP_WRITE 0x03 // store RDAC setting to 50-TP - -// SW reset: refresh RDAC with last 50-TP stored value -// If not 50-TP value, reset to 50% I think??? -// data bits are all dont cares -#define AD5272_RDAC_REFRESH 0x04 // TODO refactor this to AD5272_SOFT_RESET - -// read contents of 50-TP in next frame, at location in data bits 5:0, -// see Table 16 page 22 Rev D datasheet -// location 0x0 is reserved, 0x01 is first programmed wiper location, 0x32 is 50th programmed wiper location -#define AD5272_50TP_WIPER_READ 0x05 - -/** - * Read contents of last-programmed 50-TP location - * This is the location used in SW Reset command 4 or on POR - */ -#define AD5272_50TP_LAST_USED 0x06 - -#define AD5272_CONTROL_WRITE 0x07 // data bits 2:0 are the control bits - -#define AD5272_CONTROL_READ 0x08 // data bits all dont cares - -#define AD5272_SHUTDOWN 0x09 // data bit 0 set = shutdown, cleared = normal mode - - -/** - * Control bits are three bits written with command 7 - */ -// enable writing to the 50-TP memory by setting this control bit C0 -// default is cleared so 50-TP writing is disabled -// only 50 total writes are possible! -#define AD5272_50TP_WRITE_ENABLE 0x01 - -// enable writing to volatile RADC wiper by setting this control bit C1 -// otherwise it is frozen to the value in the 50-TP memory -// default is cleared, can't write to the wiper -#define AD5272_RDAC_WIPER_WRITE_ENABLE 0x02 - -// enable high precision calibration by clearing this control bit C2 -// set this bit to disable high accuracy mode (dunno why you would want to) -// default is 0 = emabled -#define AD5272_RDAC_CALIB_DISABLE 0x04 - -// 50TP memory has been successfully programmed if this bit is set -#define AD5272_50TP_WRITE_SUCCESS 0x08 - -#define AD5272_NORMAL_MODE 0x01 -#define AD5272_SHUTDOWN_MODE 0x01 -#define ADA2200_SYNCO_PIN NRF_GPIO_PIN_MAP(0,17) -void ir_i2c_uninit(void); -void ir_i2c_init(void); - -void ir_irq_init(void); -void ir_irq_uninit(void); - - - - - - - - -uint8_t ir_command_read(uint8_t device_id, uint8_t address, uint8_t *data); -void ir_command_write(uint8_t device_id, uint8_t address, uint8_t data); -void ad5272_i2c_is_busy(void); -int8_t ad5272_write_and_read_rdac (uint16_t data_16_to_write); -int16_t ad5272_read_rdac (void); -int8_t ad5272_write_rdac (uint16_t data_16_to_write); - -void read_all_50tp (void); -void ad5272_RDAC_refresh(void); -void ad5272_shutdown_mode(void); -void ad5272_normal_mode(void); - -#endif /* !_ADA5272_I2C_H_ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/main.c b/project/ble_peripheral/ble_app_bladder_patch/main.c index 27b0af6..8e7ccfe 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/main.c +++ b/project/ble_peripheral/ble_app_bladder_patch/main.c @@ -64,29 +64,16 @@ #include "main.h" #include "app_raw_main.h" #include "main_timer.h" -#include "ad5272_i2c.h" -#include "ada2200_spi.h" #include "power_control.h" #include "tmp235_q1.h" -#include "mcp4725_i2c.h" -#include "measurements.h" #include "fds.h" #include "battery_saadc.h" -#include "mcp4725_adc.h" -#include "meas_pd_voltage_simple.h" -#include "meas_pd_voltage_half.h" -#include "meas_pd_voltage_full.h" -#include "full_agc.h" -#include "meas_pd_voltage_custom.h" -#include "meas_pd_imm.h" #if FEATURE_SECURE_CONNECTION #include "peer_manager.h" #include "peer_manager_handler.h" #include "nrf_ble_lesc.h" #include "ble_quick_security.h" -#include "cat_interface.h" -#include "ir_i2c.h" #include "i2c_manager.h" #endif @@ -150,7 +137,6 @@ #define SEC_PARAM_MIN_KEY_SIZE 7 #define SEC_PARAM_MAX_KEY_SIZE 16 #define PASSKEY_TXT_LENGTH 8 -#define PASSKEY_LENGTH 6 #endif /*============================================================================== @@ -217,18 +203,8 @@ extern bool go_sleep_mode_enter; extern bool go_NVIC_SystemReset; extern bool ble_got_new_data; extern bool motion_data_once; -extern bool adc_enabled; extern bool con_single; extern bool info4; -extern uint16_t led_pd_dac_v[LED_NUM]; -extern uint8_t pd_adc_count; -extern int8_t c_max; -extern uint8_t simple_samples_in_buffer; -extern uint8_t full_samples_in_buffer; -extern uint8_t custom_samples_in_buffer; -extern bool pd_adc_custom_a_start; -extern bool pd_adc_custom_start; -extern bool full_agc_a_start; extern uint8_t add_cycle; extern bool motion_raw_data_enabled; @@ -247,13 +223,11 @@ bool erase_bonds; volatile bool ble_connection_st; volatile bool data_tx_in_progress = false; -extern char m_static_passkey[6]; -extern char SERIAL_NO[12]; +extern char m_static_passkey[PASSKEY_LENGTH]; +extern char SERIAL_NO[SERIAL_NO_LENGTH]; extern bool bond_data_delete; uint8_t m_reset_status; -extern uint8_t m_pd_adc_cnt; -extern uint16_t m_pd_delay_us; extern uint32_t m_life_cycle; /*============================================================================== @@ -306,14 +280,6 @@ static void full_gpio_init(void) { minimal_gpio_init(); - LED_CONFIG(); - LED_ALLOFF(); - PD_CONFIG(); - PD_ALLOFF(); - trig_r_CONFIG(); - trig_SW(false); - GAIN_SW_CONFIG(); - AGC_GAIN_SW(false); eeprom_control(OFF); DBG_PRINTF("[GPIO] Full OK\r\n"); @@ -325,14 +291,12 @@ static void full_gpio_init(void) *============================================================================*/ static void load_default_config(void) { - memset(SERIAL_NO, 0, 16); + memset(SERIAL_NO, 0, SERIAL_NO_LENGTH); memcpy(SERIAL_NO, FIRMWARE_SERIAL_NO, strlen(FIRMWARE_SERIAL_NO)); - memset(m_static_passkey, 0, 16); - memcpy(m_static_passkey, "123456", 6); + memset(m_static_passkey, 0, PASSKEY_LENGTH); + memcpy(m_static_passkey, "123456", PASSKEY_LENGTH); - m_pd_delay_us = 8000; - m_pd_adc_cnt = 8; m_reset_status = 1; bond_data_delete = 1; @@ -352,7 +316,7 @@ static void load_flash_config(void) /* Hardware Number — fill default if empty */ if (m_config.hw_no[0] == 0 || m_config.hw_no[0] == (char)0xFF) { - memset(m_config.hw_no, 0, 12); + memset(m_config.hw_no, 0, HW_NO_LENGTH); memcpy(m_config.hw_no, HARDWARE_VERSION, strlen(HARDWARE_VERSION)); DBG_PRINTF("[CFG] HW empty, set default: %s\r\n", HARDWARE_VERSION); m_need_save_defaults = true; @@ -360,19 +324,19 @@ static void load_flash_config(void) /* Serial Number — fill default if empty */ if (m_config.serial_no[0] == 0 || m_config.serial_no[0] == (char)0xFF) { - memset(m_config.serial_no, 0, 12); + memset(m_config.serial_no, 0, SERIAL_NO_LENGTH); memcpy(m_config.serial_no, FIRMWARE_SERIAL_NO, strlen(FIRMWARE_SERIAL_NO)); DBG_PRINTF("[CFG] S/N empty, set default: %s\r\n", FIRMWARE_SERIAL_NO); m_need_save_defaults = true; } /* Serial Number → BLE device name */ - memset(SERIAL_NO, 0, 16); - memcpy(SERIAL_NO, m_config.serial_no, 12); + memset(SERIAL_NO, 0, SERIAL_NO_LENGTH); + memcpy(SERIAL_NO, m_config.serial_no, SERIAL_NO_LENGTH); /* Passkey */ - memset(m_static_passkey, 0, 16); - memcpy(m_static_passkey, m_config.static_passkey, 6); + memset(m_static_passkey, 0, PASSKEY_LENGTH); + memcpy(m_static_passkey, m_config.static_passkey, PASSKEY_LENGTH); /* Bond data delete flag */ bond_data_delete = m_config.bond_data_delete; @@ -380,52 +344,12 @@ static void load_flash_config(void) /* Reset status */ m_reset_status = m_config.reset_status; - /* Measurement parameters (with validation) */ - m_pd_adc_cnt = (m_config.pd_adc_cnt > 0 && m_config.pd_adc_cnt <= 32) - ? m_config.pd_adc_cnt : 8; - m_pd_delay_us = (m_config.pd_delay_us > 0) - ? m_config.pd_delay_us : 8000; - - DBG_PRINTF("[CFG] HW=%.12s S/N=%s passkey=%.6s bond=%d rst=%d adc=%d delay=%u\r\n", + DBG_PRINTF("[CFG] HW=%.12s S/N=%s passkey=%.6s bond=%d rst=%d\r\n", m_config.hw_no, SERIAL_NO, m_static_passkey, bond_data_delete, - m_reset_status, m_pd_adc_cnt, m_pd_delay_us); + m_reset_status); } -#if !DEBUG_MINIMAL_BOOT -static void load_eeprom_config(void) -{ - DBG_PRINTF("[CFG] EEPROM loading...\r\n"); - - eeprom_initialize(); - nrf_delay_us(10); - eeprom_init_values_read(); - eeprom_uninitialize(); - nrf_delay_us(50); - -#if BLE_DEV_MODE - memset(SERIAL_NO, 0, 16); - memcpy(SERIAL_NO, FIRMWARE_SERIAL_NO, strlen(FIRMWARE_SERIAL_NO)); - DBG_PRINTF("[CFG] DEV S/N=%s\r\n", SERIAL_NO); -#else - if (!is_valid_serial_no(SERIAL_NO)) - { - memset(SERIAL_NO, 0, 16); - memcpy(SERIAL_NO, FIRMWARE_SERIAL_NO, strlen(FIRMWARE_SERIAL_NO)); - } - - char const init_pass[6] = "123456"; - memset(m_static_passkey, 0, 16); - memcpy(m_static_passkey, (uint8_t *)init_pass, 6); -#endif - - m_pd_delay_us = 8000; - m_pd_adc_cnt = 8; - m_reset_status = 1; - bond_data_delete = BLE_DEV_MODE ? 1 : 0; - - DBG_PRINTF("[CFG] EEPROM OK\r\n"); -} -#endif +/* load_eeprom_config() 삭제 — EEPROM 제거됨, FDS가 대체 - jhChun 26.03.16 */ /*============================================================================== * TIMER CALLBACKS @@ -468,11 +392,6 @@ static void timers_init(void) main_timer_init(); battery_timer_init(); - imm_check_timer_init(); - m48_check_timer_init(); - full_agc_timer_init(); - full_agc_send_timer_init(); - mea_send_timer_init(); power_timer_init(); #if FEATURE_PRINTF @@ -879,8 +798,6 @@ static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) if (device_status == true) { - LED_ALLOFF(); - PD_ALLOFF(); if (device_sleep_mode() == 0) { device_status = false; @@ -1150,7 +1067,7 @@ void device_power_off(void) /*============================================================================== * DATA TRANSMISSION *============================================================================*/ -void data_tx_handler(char const *p_data_to_send) +void data_tx_handler(char const *p_data_to_send) // 문자열 (ASCII 텍스트) 전송 함수 { if (m_tx_in_progress) return; @@ -1180,8 +1097,9 @@ void data_tx_handler(char const *p_data_to_send) m_conn_handle = BLE_CONN_HANDLE_INVALID; m_tx_in_progress = false; } else { + DBG_PRINTF("[BLE TX] Err:0x%X\r\n", err_code); // APP_ERROR_CHECK 대신 로그 - jhChun 26.03.16 m_tx_in_progress = false; - APP_ERROR_CHECK(err_code); + //APP_ERROR_CHECK(err_code); } } } @@ -1245,46 +1163,10 @@ void ascii_format_data(uint8_t *buffer, const char *tag, const char *data_ascii, } } -void binary_tx_handler(uint8_t const *ble_bin_buff, uint16_t length) -{ - uint32_t err_code; - static uint8_t tx_buffer[BLE_NUS_MAX_DATA_LEN] = {0}; - - if (ble_connection_st == 0) return; - - data_tx_in_progress = true; - - if (length * sizeof(uint16_t) > (BLE_NUS_MAX_DATA_LEN - 2)) return; - - if (ble_connection_st == BLE_CONNECTED_ST) - { - memcpy(tx_buffer, ble_bin_buff, length * sizeof(uint16_t)); - uint16_t crc = crc16_compute(tx_buffer, length * sizeof(uint16_t), NULL); - tx_buffer[length * sizeof(uint16_t)] = (uint8_t)(crc & 0xFF); - tx_buffer[length * sizeof(uint16_t) + 1] = (uint8_t)((crc >> 8) & 0xFF); - - uint16_t total_len = length * sizeof(uint16_t) + 2; - - do { - err_code = ble_nus_data_send(&m_nus, tx_buffer, &total_len, m_conn_handle); - if ((err_code != NRF_ERROR_INVALID_STATE) && - (err_code != NRF_ERROR_RESOURCES) && - (err_code != NRF_ERROR_NOT_FOUND)) - { - nrf_delay_ms(10); - } - APP_ERROR_CHECK(err_code); - } while (err_code == NRF_ERROR_RESOURCES); - - data_tx_in_progress = false; - } -} - /** * @brief Safe BLE binary transmission with proper error handling * - * Unlike binary_tx_handler which may assert on errors, - * this function properly handles NRF_ERROR_RESOURCES by retrying + * Properly handles NRF_ERROR_RESOURCES by retrying * and returns gracefully on connection errors. * * @param ble_bin_buff Data buffer to send @@ -1309,18 +1191,19 @@ void dr_sd_delay_ms(uint32_t ms) nrf_delay_ms(ms); } -void dr_binary_tx_safe(uint8_t const *ble_bin_buff, uint16_t length) +/* 기존 binary_tx_handler 함수 삭제 및 호출처 교체 - jhChun 26.03.16 */ +void dr_binary_tx_safe(uint8_t const *ble_bin_buff, uint16_t length) // BLE로 바이너리 데이터를 안전하게 전송하는 함수 { uint32_t err_code; static uint8_t tx_buffer[BLE_NUS_MAX_DATA_LEN] = {0}; uint16_t retry_count = 0; const uint16_t MAX_RETRIES = 100; /* Max retries (~500ms at 5ms each) */ - if (ble_connection_st == 0) return; + if (ble_connection_st == 0) return; // 연결 확인 data_tx_in_progress = true; - if (length * sizeof(uint16_t) > (BLE_NUS_MAX_DATA_LEN - 2)) { + if (length * sizeof(uint16_t) > (BLE_NUS_MAX_DATA_LEN - 2)) { // 길이 검증 (CRC 2바이트 공간 확보) data_tx_in_progress = false; return; } @@ -1328,9 +1211,9 @@ void dr_binary_tx_safe(uint8_t const *ble_bin_buff, uint16_t length) if (ble_connection_st == BLE_CONNECTED_ST) { memcpy(tx_buffer, ble_bin_buff, length * sizeof(uint16_t)); - uint16_t crc = crc16_compute(tx_buffer, length * sizeof(uint16_t), NULL); + uint16_t crc = crc16_compute(tx_buffer, length * sizeof(uint16_t), NULL); // 버퍼 복사 tx_buffer[length * sizeof(uint16_t)] = (uint8_t)(crc & 0xFF); - tx_buffer[length * sizeof(uint16_t) + 1] = (uint8_t)((crc >> 8) & 0xFF); + tx_buffer[length * sizeof(uint16_t) + 1] = (uint8_t)((crc >> 8) & 0xFF); // CRC16 2바이트 추가 uint16_t total_len = length * sizeof(uint16_t) + 2; @@ -1339,27 +1222,26 @@ void dr_binary_tx_safe(uint8_t const *ble_bin_buff, uint16_t length) uint16_t send_len = total_len; /* MUST reset each iteration - ble_nus_data_send modifies it! */ err_code = ble_nus_data_send(&m_nus, tx_buffer, &send_len, m_conn_handle); - if (err_code == NRF_SUCCESS) { + if (err_code == NRF_SUCCESS) { // 전송 성공 -> 루프 탈출 /* TX queued successfully */ break; - } else if (err_code == NRF_ERROR_RESOURCES) { + } else if (err_code == NRF_ERROR_RESOURCES) { // TX 큐가 가득 찬 경우 5ms 대기 후 재시도 (최대 100회, ~500ms) /* BLE TX queue full - wait for connection event to complete TX */ /* Use small delay to allow BLE stack to process TX complete events */ nrf_delay_ms(5); /* Wait ~5ms for TX slot to free up */ retry_count++; - } else if (err_code == NRF_ERROR_INVALID_STATE || - err_code == NRF_ERROR_NOT_FOUND) { + } else if (err_code == NRF_ERROR_INVALID_STATE || err_code == NRF_ERROR_NOT_FOUND) { // 연결 끊김, 리턴 DBG_PRINTF("[BLE TX] Disconnected\r\n"); data_tx_in_progress = false; return; - } else { + } else { // 기타 에러 -> 로그 출력 후 리턴 DBG_PRINTF("[BLE TX] Err:0x%X\r\n", err_code); data_tx_in_progress = false; return; } } while (retry_count < MAX_RETRIES); - if (retry_count >= MAX_RETRIES) { + if (retry_count >= MAX_RETRIES) { // 최대 재시도(100회) 초과 시 해당 패킷 드롭, 연결은 유지 DBG_PRINTF("[BLE TX] FAIL %u retries\r\n", retry_count); data_tx_in_progress = false; /* Don't set ble_connection_st = 0 here - just drop this packet and continue */ @@ -1395,15 +1277,10 @@ static void main_s(void * p_context) power_control_handler(ON); nrf_delay_ms(100); bond_data_delete = true; - eeprom_initialize(); - nrf_delay_ms(10); - eeprom_write_byte(0x0060, (uint8_t)bond_data_delete); - nrf_delay_ms(20); - const char pass_init[6] = "123456"; - eeprom_write_encrypted(0x0020, (uint8_t *)pass_init, 6); - nrf_delay_ms(10); - eeprom_init_values_read(); - eeprom_uninitialize(); + m_config.bond_data_delete = (uint8_t)bond_data_delete; + const char pass_init[PASSKEY_LENGTH] = "123456"; + memcpy(m_config.static_passkey, pass_init, PASSKEY_LENGTH); + config_save(); nrf_delay_ms(1000); go_device_power_off = true; main_timer_start(); @@ -1435,16 +1312,10 @@ static void main_s(void * p_context) advertising_start(); #endif - ada2200_init(); - nrf_delay_ms(1); - mcp4725_init(); - nrf_delay_ms(1); - ad5272_i2c_init(); m_reset_status = 1; - eeprom_write_byte(0x0065, m_reset_status); - nrf_delay_ms(10); - eeprom_init_values_read(); + m_config.reset_status = m_reset_status; + config_save(); #endif m_reset_status = 1; DBG_PRINTF("[BOOT] Ready\r\n"); diff --git a/project/ble_peripheral/ble_app_bladder_patch/main.h b/project/ble_peripheral/ble_app_bladder_patch/main.h index ad43a1a..26d047f 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/main.h +++ b/project/ble_peripheral/ble_app_bladder_patch/main.h @@ -9,6 +9,13 @@ #ifndef MAIN_H__ #define MAIN_H__ +/*============================================================================== + * DATA LENGTH CONSTANTS + *============================================================================*/ +#define SERIAL_NO_LENGTH 12 +#define HW_NO_LENGTH 12 +#define PASSKEY_LENGTH 6 + #include #include #include @@ -54,7 +61,6 @@ static void PM_s(void * p_context); static void main_routine_handler(void * p_context); void received_command_process(uint8_t const *data_array, which_cmd_t cmd_t,uint8_t length); void data_tx_handler(char const *p_data_to_send); -void binary_tx_handler(uint8_t const *ble_bin_buff , uint16_t length); void dr_binary_tx_safe(uint8_t const *ble_bin_buff, uint16_t length); void dr_sd_delay_ms(uint32_t ms); void single_format_data(uint8_t *buffer, const char *tag, const uint16_t value) ; diff --git a/project/ble_peripheral/ble_app_bladder_patch/main_timer.c b/project/ble_peripheral/ble_app_bladder_patch/main_timer.c index e4575b3..66e0e18 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/main_timer.c +++ b/project/ble_peripheral/ble_app_bladder_patch/main_timer.c @@ -28,14 +28,8 @@ #include "main_timer.h" #include "tmp235_q1.h" //#include "fstorage.h" -//#include "meas_pd_voltage_custom.h" -#include "meas_pd_imm.h" -#include "meas_pd_voltage_full.h" -#include "mcp4725_i2c.h" -#include "ad5272_i2c.h" #include "power_control.h" #include -#include "meas_pd_48.h" #include "debug_print.h" #include "i2c_manager.h" //add cj APP_TIMER_DEF(m_main_loop_timer_id); @@ -55,15 +49,12 @@ extern which_cmd_t cmd_type_t; #endif bool go_batt= false; bool go_temp= false; -bool go_pdread= false; bool go_device_power_off = false; bool go_sleep_mode_enter = false; bool go_NVIC_SystemReset = false; bool motion_raw_data_enabled = false; bool ble_got_new_data = false; bool motion_data_once = false; -bool adc_enabled = false; -static uint16_t cnt_adc = 0; void main_loop(void * p_context) /* For x ms */ { UNUSED_PARAMETER(p_context); @@ -148,30 +139,6 @@ void main_loop(void * p_context) /* For x ms */ // main_timer_start(); } - if(go_pdread == true) { - //DBG_PRINTF("PD48 ADC=%d\r\n",cnt_adc); - main_timer_stop(); - go_pdread = false; - m48_adc_start_init(); - } - if(adc_enabled == true) { - main_timer_stop(); - DBG_PRINTF("PD48 ADC=%d\r\n",cnt_adc); - - - if(ble_got_new_data==false){ - - if (cnt_adc<500){ - cnt_adc++; - - } - else if (cnt_adc == 500){ - cnt_adc = 0; - } - - main_timer_start(); - } - } diff --git a/project/ble_peripheral/ble_app_bladder_patch/mcp4725_adc.c b/project/ble_peripheral/ble_app_bladder_patch/mcp4725_adc.c deleted file mode 100644 index 9869045..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/mcp4725_adc.c +++ /dev/null @@ -1,114 +0,0 @@ -/******************************************************************************* - * @file mcp4725_adc.c - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#include "sdk_common.h" - -#include -#include -#include -#include -#include "nrf.h" -#include "boards.h" -#include "app_error.h" -#include "nrf_drv_saadc.h" -#include "ble_nus.h" -#include "mcp4725_adc.h" -#include "main.h" -#include "debug_print.h" -#define MCP4725_REF_VOLTAGE_IN_MILLIVOLTS 600.0f /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ -#define MCP4725_PRE_SCALING_COMPENSATION 6.0f /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/ -#define MCP4725_ADC_RES_10BITS 1024.0f /**< Maximum digital value for 10-bit ADC conversion. */ - -/**@brief Macro to convert the result of ADC conversion in millivolts. - * - * @param[in] ADC_VALUE ADC result. - * - * @retval Result converted to millivolts. - */ -#define MCP4725_VOUT_IN_MILLI_VOLTS(ADC_VALUE)\ - ((((ADC_VALUE) * MCP4725_REF_VOLTAGE_IN_MILLIVOLTS) / MCP4725_ADC_RES_10BITS) * MCP4725_PRE_SCALING_COMPENSATION) - -#define ADC_SAMPLES_IN_BUFFER 1 - -static nrf_saadc_value_t mcp4725_adc_buf[2][ADC_SAMPLES_IN_BUFFER]; -float mcp4725_voltage_in_milli_volts = 0; - -//extern char ble_tx_buffer[BLE_NUS_MAX_DATA_LEN]; - -extern which_cmd_t cmd_type_t; -extern uint8_t ble_bin_buffer[BLE_NUS_MAX_DATA_LEN] ; - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -void mcp4725_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* ADC_GAIN reading */ -{ - float Vref = 3.3f; /* It same as Vdd */ - float dac_value = 0.0f; - uint16_t dac_value_16=0; - if (p_event->type == NRF_DRV_SAADC_EVT_DONE) - { - nrf_saadc_value_t adc_result; - - nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, ADC_SAMPLES_IN_BUFFER); - adc_result = p_event->data.done.p_buffer[0]; - - nrf_drv_saadc_uninit(); - nrf_drv_saadc_channel_uninit(0); - - mcp4725_voltage_in_milli_volts = MCP4725_VOUT_IN_MILLI_VOLTS(adc_result); -#if FEATURE_DETAIL_VALUE_AGC - DBG_PRINTF("AGC read Vol: %f(mV)\r\n", mcp4725_voltage_in_milli_volts); -#endif - /* For MCP4725, Dn = (Vout/Vref) x 4096, Vref = Vdd */ - dac_value = (((mcp4725_voltage_in_milli_volts/Vref) * 4096.0f)/1000.0f); /* Unit is Volt */ - if(cmd_type_t == CMD_UART) { - DBG_PRINTF("Te%d\r\n\r\n",(uint16_t)(dac_value + 0.5f)); - } else if(cmd_type_t == CMD_BLE) { - dac_value_16 = (uint16_t)(dac_value + 0.5f); - single_format_data(ble_bin_buffer, "rse:", dac_value_16); - - - - - binary_tx_handler(ble_bin_buffer,3); -// sprintf(ble_tx_buffer, "Te%d\r\n",(uint16_t)(dac_value + 0.5f)); -// data_tx_handler(ble_tx_buffer); - } - } -} - - -void mcp4725_adc_init(void) -{ - ret_code_t err_code = nrf_drv_saadc_init(NULL, mcp4725_voltage_handler); - APP_ERROR_CHECK(err_code); - - nrf_saadc_channel_config_t config = - NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN6); /* FSA5157P6X Voltage Output Measurement */ - - err_code = nrf_drv_saadc_channel_init(0, &config); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_buffer_convert(mcp4725_adc_buf[0], ADC_SAMPLES_IN_BUFFER); - APP_ERROR_CHECK(err_code); - err_code = nrf_drv_saadc_buffer_convert(mcp4725_adc_buf[1], ADC_SAMPLES_IN_BUFFER); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_sample(); - APP_ERROR_CHECK(err_code); -} - - -void mcp4725_voltage_level_meas(void) -{ - mcp4725_adc_init(); -} - diff --git a/project/ble_peripheral/ble_app_bladder_patch/mcp4725_adc.h b/project/ble_peripheral/ble_app_bladder_patch/mcp4725_adc.h deleted file mode 100644 index 4b16cbb..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/mcp4725_adc.h +++ /dev/null @@ -1,16 +0,0 @@ -/******************************************************************************* - * @file mcp4725.h - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#ifndef _MCP4725_ADC_H_ -#define _MCP4725_ADC_H_ - -void mcp4725_adc_init(void); -void mcp4725_voltage_level_meas(void); - -#endif /* !_MCP4725_ADC_H_ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/mcp4725_i2c.c b/project/ble_peripheral/ble_app_bladder_patch/mcp4725_i2c.c deleted file mode 100644 index cb632e0..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/mcp4725_i2c.c +++ /dev/null @@ -1,513 +0,0 @@ -/******************************************************************************* - * @file mcp4725_i2c.c - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -/* board driver */ -#include -#include -#include - -#include -#include -#include "nrf.h" -#include "app_error.h" -#include "boards.h" -#include "nrfx_gpiote.h" - -#include "mcp4725_i2c.h" -#include "nrf_delay.h" -#include "debug_print.h" - -/* I2C number and slave address for MCP4725 */ -#define MCP4725_I2C_ADDR_7bit 0x66 -uint8_t MCP4725_I2C_ADDR = MCP4725_I2C_ADDR_7bit << 1; - -uint16_t _lastValue; -uint8_t _powerDownMode; -uint32_t _lastWriteEEPROM; - - -void mcp4725_i2c_initialize(void) -{ - SCL_OUT(); - SDA_OUT(); - SCL_H(); - SDA_H(); -} - - -static uint8_t mcp4725_i2c_write(uint8_t data) -{ - for(uint8_t i = 0; i < 8; i++) - { - // MSB first - if(data & 0x80) SDA_H(); - else SDA_L(); - i2c_clock(); - data = data << 1; - } - - // read ACK - SDA_H(); // leave SDA HI - SDA_IN(); // change direction to input on SDA line - - i2c_delay(); - SCL_H(); // clock back up - i2c_delay(); - uint8_t ack = SDA_READ(); // get the ACK bit - SCL_L(); - - SDA_OUT(); // change direction back to output - - if(ack) { - DBG_PRINTF("ACK Extra=%d,Data=%d\r\n", ack,data); - } - - return ack; -} - - -static uint8_t mcp4725_i2c_read(bool ack) -{ - uint8_t data; - - SDA_H(); // leave SDA HI - SDA_IN(); // change direction to input on SDA line - - data = 0; - for(uint8_t i = 0; i < 8; i++) - { - // MSB first - data = data << 1; - - SCL_H(); - do{ - }while(SCL_READ() != 0); // Wait for any SCL clock stratching - - i2c_delay(); - if(SDA_READ()) // get the Data bit - data |= 1; - else - data |= 0; - SCL_L(); // clock LO - i2c_delay(); - } - - SDA_OUT(); // change direction back to output - - // send ACK - if(ack == ACK) SDA_L(); - else if(ack == NACK) SDA_H(); - i2c_clock(); - SDA_H(); // leave with SDA HI - - return data; -} - - -void mcp4725_writeFastMode(const uint16_t value) -{ - uint8_t low = value & 0xFF; - uint8_t high = ((value >> 8) & 0x0F); // set C2,c1 == 0,0(FastMode Write) pd1,pd0 == 0,0 (Normal Mode) - - i2c_start(); - mcp4725_i2c_write(MCP4725_I2C_ADDR|TWI_WRITE); // slave address - - //uint8_t address = MCP4725_I2C_ADDR | TWI_WRITE; - //DBG_PRINTF("[I2C] Write to 0x%02X\r\n", address); //oxCC - - mcp4725_i2c_write(high); // value1 ~ 3 - mcp4725_i2c_write(low); - i2c_stop(); -} - - -void mcp4725_generalCall(const uint8_t gc) -{ - i2c_start(); - mcp4725_i2c_write(0x00); // First Byte 0x00 - mcp4725_i2c_write(gc); // Second Byte, General Call Reset = 0x06, General Call Wake-Up = 0x09 - i2c_stop(); -} - - -void mcp4725_init(void) -{ - mcp4725_i2c_initialize(); -} - -// DAC value is reset to EEPROM value -// need to reflect this in cached value -void mcp4725_powerOnReset(void) -{ - mcp4725_generalCall(MCP4725_GC_RESET); -} - - -// _powerDownMode DAC resets to 0 -- PDM EEPROM stays same !!! -// need to reflect this in cached value -void mcp4725_powerOnWakeUp(void) -{ - mcp4725_generalCall(MCP4725_GC_WAKEUP); -} - -/* 현재 DAC값 읽어서 그 값에 Power Down 넣고 Write */ -void mcp4725_PowerDownMode(void) -{ - uint8_t low = 0x00; //read_value & 0xFF; - uint8_t high = 0x00; //((read_value >> 8) & 0x0F); - high = high | (MCP4725_PDMODE_1K << 4); // set C2,c1 == 0,0(FastMode Write) pd1,pd0 == 0,1 (Power Down Mode, 1Kohm to GND) - - i2c_start(); - mcp4725_i2c_write(MCP4725_I2C_ADDR|TWI_WRITE); // slave address - mcp4725_i2c_write(high); // value - mcp4725_i2c_write(low); - i2c_stop(); -} - -//////////////////////////////////////////////////////////////////////////////// - -uint16_t mcp4725_readDAC(void) -{ - while(!mcp4725_ready()); - uint8_t buffer[3]; - mcp4725_readRegister(buffer, 3); - uint16_t value = buffer[1]; - value = value << 4; - value = value + (buffer[2] >> 4); - return value; -} - - -// ready checks if the last write to EEPROM has been written. -// until ready all writes to the MCP4725 are ignored! -bool mcp4725_ready(void) -{ - uint8_t buffer[1]; - mcp4725_readRegister(buffer, 1); - return ((buffer[0] & 0x80) > 0); -} - - -void mcp4725_writeRegisterMode(const uint16_t value, uint8_t reg) -{ - uint8_t high = (value / 16); - uint8_t low = (value & 0x0F) << 4; - reg = reg | (_powerDownMode << 1); - - i2c_start(); - mcp4725_i2c_write(MCP4725_I2C_ADDR|TWI_WRITE); // slave address - mcp4725_i2c_write(reg); // configuration - mcp4725_i2c_write(high); // value1 ~ 3 - mcp4725_i2c_write(low); - i2c_stop(); -} - - -void mcp4725_readRegister(uint8_t* buffer, const uint8_t length) -{ - i2c_start(); - mcp4725_i2c_write(MCP4725_I2C_ADDR|TWI_READ); // slave address with READ - switch(length) { - case 1: - buffer[0] = mcp4725_i2c_read(NACK); // NACK, SDA = 1; - break; - - case 2: - buffer[0] = mcp4725_i2c_read(ACK); // ACK, SDA = 0; - buffer[1] = mcp4725_i2c_read(NACK); // NACK, SDA = 1; - break; - - case 3: - buffer[0] = mcp4725_i2c_read(ACK); // ACK, SDA = 0; - buffer[1] = mcp4725_i2c_read(ACK); // ACK, SDA = 0; - buffer[2] = mcp4725_i2c_read(NACK); // NACK, SDA = 1; - break; - - case 4: - buffer[0] = mcp4725_i2c_read(ACK); // ACK, SDA = 0; - buffer[1] = mcp4725_i2c_read(ACK); // ACK, SDA = 0; - buffer[2] = mcp4725_i2c_read(ACK); // ACK, SDA = 0; - buffer[3] = mcp4725_i2c_read(NACK); // NACK, SDA = 1; - break; - - case 5: - buffer[0] = mcp4725_i2c_read(ACK); // ACK, SDA = 0; - buffer[1] = mcp4725_i2c_read(ACK); // ACK, SDA = 0; - buffer[2] = mcp4725_i2c_read(ACK); // ACK, SDA = 0; - buffer[3] = mcp4725_i2c_read(ACK); // ACK, SDA = 0; - buffer[4] = mcp4725_i2c_read(NACK); // NACK, SDA = 1; - break; - - default: -#if FEATURE_PRINTF - DBG_PRINTF("ERR!! mcp4725_i2c_readregister\r\n"); -#endif - break; - } - - i2c_stop(); - -} - - -void mcp4725_setValue(const uint16_t value) -{ - if (value == _lastValue) return; - if (value > MCP4725_MAXVALUE) return; - mcp4725_writeFastMode(value); - _lastValue = value; -} - - -uint16_t mcp4725_getValue(void) -{ - return _lastValue; -} - - -void mcp4725_setPercentage(float percentage) -{ - if ((percentage > 100) || (percentage < 0)) - DBG_PRINTF("ERR!!! mcp4725 percentage error\r\n"); - mcp4725_setValue(round(percentage * (0.01 * MCP4725_MAXVALUE))); -} - - -// unfortunately it is not possible to write a different value -// to the DAC and EEPROM simultaneously or write EEPROM only. -void mcp4725_writeDAC(const uint16_t value, const bool EEPROM) -{ - if (value > MCP4725_MAXVALUE) -#if FEATURE_PRINTF - DBG_PRINTF("ERR!!! mcp4725 writeDAC error\r\n"); -#endif - while(!mcp4725_ready()); - mcp4725_writeRegisterMode(value, EEPROM ? MCP4725_DACEEPROM : MCP4725_DAC); - _lastValue = value; -} - - -uint16_t mcp4725_readEEPROM(void) -{ - while(!mcp4725_ready()); - uint8_t buffer[5]; - mcp4725_readRegister(buffer, 5); - uint16_t value = buffer[3] & 0x0F; - value = value << 8; - value = value + buffer[4]; - return value; -} - - -// depending on bool EEPROM the value of PDM is written to -// (false) DAC or -// (true) DAC & EEPROM, -void mcp4725_writePowerDownMode(const uint8_t PDM, const bool EEPROM) -{ - _powerDownMode = (PDM & 0x03); // mask PDM bits only (written later low level) - - _lastValue = mcp4725_readDAC(); - _powerDownMode = mcp4725_readPowerDownModeDAC(); - mcp4725_writeDAC(_lastValue, EEPROM); -} - - -uint8_t mcp4725_readPowerDownModeEEPROM(void) -{ - while(!mcp4725_ready()); - uint8_t buffer[4]; - mcp4725_readRegister(buffer, 4); - uint8_t value = (buffer[3] >> 5) & 0x03; - return value; -} - - -uint8_t mcp4725_readPowerDownModeDAC(void) -{ - while(!mcp4725_ready()); // TODO needed? - uint8_t buffer[1]; - mcp4725_readRegister(buffer, 1); - uint8_t value = (buffer[0] >> 1) & 0x03; - return value; -} - - - - - - - -void ds_i2c_start(void) { - SDA_H();//nrf_gpio_pin_set(I2C_SDA_PIN); - SCL_H();//nrf_gpio_pin_set(I2C_SCL_PIN); - i2c_delay();//nrf_delay_us(I2C_DELAY_US); - SDA_L();//nrf_gpio_pin_clear(I2C_SDA_PIN); - i2c_delay();//nrf_delay_us(I2C_DELAY_US); - SCL_L();//nrf_gpio_pin_clear(I2C_SCL_PIN); - i2c_delay();//nrf_delay_us(I2C_DELAY_US); -} - -void ds_i2c_stop(void) { - i2c_delay();//nrf_delay_us(I2C_DELAY_US); - SDA_L();//nrf_gpio_pin_clear(I2C_SDA_PIN); - SCL_H();// nrf_gpio_pin_set(I2C_SCL_PIN); - i2c_delay();//nrf_delay_us(I2C_DELAY_US); - SDA_H();//nrf_gpio_pin_set(I2C_SDA_PIN); - i2c_delay();//nrf_delay_us(I2C_DELAY_US); -} - - - - - - - - - - - - - -void i2c_write_bit(uint8_t bit) { - if (bit) { - SDA_H(); - } else { - SDA_L(); - } - i2c_delay();//nrf_delay_us(I2C_DELAY_US); - SCL_H(); //nrf_gpio_pin_set(SCL_PIN); - i2c_delay();//nrf_delay_us(I2C_DELAY_US); - SCL_L();//nrf_gpio_pin_clear(SCL_PIN); -} - -uint8_t i2c_read_bit(void) { - uint8_t bit; - SDA_IN();//nrf_gpio_cfg_input(SDA_PIN, NRF_GPIO_PIN_NOPULL); - i2c_delay();//nrf_delay_us(I2C_DELAY_US); - SCL_H(); ////nrf_gpio_pin_set(SCL_PIN); - i2c_delay();//nrf_delay_us(I2C_DELAY_US); - bit = SDA_READ();//nrf_gpio_pin_read(SDA_PIN); - SCL_L(); //nrf_gpio_pin_clear(SCL_PIN); - SDA_OUT();//nrf_gpio_cfg_output(SDA_PIN); - return bit; -} -uint8_t i2c_write_byte(uint8_t byte) { - for (uint8_t i = 0; i < 8; i++) { - i2c_write_bit(byte & 0x80); - byte <<= 1; - } - return i2c_read_bit(); // Read ACK/NACK -} - -uint8_t i2c_read_byte(uint8_t ack) { - uint8_t byte = 0; - SDA_IN();//nrf_gpio_cfg_input(SDA_PIN, NRF_GPIO_PIN_NOPULL); - for (uint8_t i = 0; i < 8; i++) { - byte <<= 1; - byte |= i2c_read_bit(); - } - SDA_OUT();//nrf_gpio_cfg_output(SDA_PIN); - i2c_write_bit(!ack); // Send ACK/NACK - return byte; -} -void i2c_repeated_start(void) { - SDA_H();//nrf_gpio_pin_set(SDA_PIN); - SCL_H();//nrf_gpio_pin_set(SCL_PIN); - i2c_delay();//nrf_delay_us(I2C_DELAY_US); - SDA_L();////nrf_gpio_pin_clear(SDA_PIN); - i2c_delay();//nrf_delay_us(I2C_DELAY_US); - SCL_L();//nrf_gpio_pin_clear(SCL_PIN); -} - -// i2c_start(); -// i2c_write_byte(I2C_ADDRESS << 1); // Write address -// i2c_write_byte(0x00); // Register address -// i2c_write_byte(0xFF); // Data -// i2c_stop(); - -// // Read example -// i2c_start(); -// i2c_write_byte((I2C_ADDRESS << 1) | 1); // Read address -// uint8_t data = i2c_read_byte(0); // Read data with NACK -// i2c_stop(); - - -void DS3930_write(uint8_t id, uint8_t addr, uint8_t wdata) -{ -//i2c_start(); -// ds_i2c_stop(); - ds_i2c_start(); - i2c_write_byte(id << 1); // Write address - i2c_write_byte(addr); // Register address - i2c_write_byte(wdata); // Data - -// mcp4725_i2c_write(id << 1); -// mcp4725_i2c_write(addr); -// mcp4725_i2c_write(wdata); -// -// } -//i2c_delay(); -//i2c_stop(); - ds_i2c_stop(); -} - - - -uint8_t DS3930_read(uint8_t id, uint8_t addr, uint8_t* rdata) -{ - ds_i2c_start(); - i2c_write_byte(id << 1); // Write address - i2c_write_byte(addr); // Register address - i2c_repeated_start(); - i2c_write_byte((id << 1) | 1); // Read address - uint8_t data = i2c_read_byte(0); // Read data with NACK - ds_i2c_stop(); - rdata[0] = data; - DBG_PRINTF("Data 0x%x . \r\n", data); - //i2c_stop(); - return data; -} - - - - -//void CAT24_write(uint8_t id, uint8_t addr, uint8_t* wdata) -//{ -////i2c_start(); -//// ds_i2c_stop(); -// ds_i2c_start(); -// i2c_write_byte(id << 1); // Write address -// i2c_write_byte(addr); // Register address -// i2c_write_byte(wdata); // Data -// -//// mcp4725_i2c_write(id << 1); -//// mcp4725_i2c_write(addr); -//// mcp4725_i2c_write(wdata); -//// -//// } -////i2c_delay(); -////i2c_stop(); -// ds_i2c_stop(); -//} - - -//uint8_t CAT24_read(uint8_t id, uint8_t addr, uint8_t* rdata,uint8_t length) -//{ -// ds_i2c_start(); -// i2c_write_byte(id << 1); // Write address -// i2c_write_byte(addr); // Register address -// i2c_repeated_start(); -// i2c_write_byte((id << 1) | 1); // Read address -// uint8_t data = i2c_read_byte(0); // Read data with NACK -// ds_i2c_stop(); -// rdata[0] = data; -// DBG_PRINTF("Data 0x%x . \r\n", data); -// //i2c_stop(); -// return data; -//} - diff --git a/project/ble_peripheral/ble_app_bladder_patch/mcp4725_i2c.h b/project/ble_peripheral/ble_app_bladder_patch/mcp4725_i2c.h deleted file mode 100644 index 3745b61..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/mcp4725_i2c.h +++ /dev/null @@ -1,92 +0,0 @@ -/******************************************************************************* - * @file mcp4725_i2c.h - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ -#include "sdk_common.h" - -#include -#include "nrf.h" -#include "nrf_drv_gpiote.h" -#ifndef _MCP4725_I2C_H_ -#define _MCP4725_I2C_H_ - -#define MCP4725_I2C_SDA_PIN NRF_GPIO_PIN_MAP(1,15)//cj edit -#define MCP4725_I2C_SCL_PIN NRF_GPIO_PIN_MAP(1,14) //cd eidt - -#define SDA_H() nrf_gpio_pin_set(MCP4725_I2C_SDA_PIN) // SDA pin high -#define SDA_L() nrf_gpio_pin_clear(MCP4725_I2C_SDA_PIN) // SDA pin low -#define SCL_H() nrf_gpio_pin_set(MCP4725_I2C_SCL_PIN) // SCL pin high -#define SCL_L() nrf_gpio_pin_clear(MCP4725_I2C_SCL_PIN) // SCL pin low -#define SDA_OUT() nrf_gpio_cfg_output(MCP4725_I2C_SDA_PIN) // SDA pin output mode -#define SCL_OUT() nrf_gpio_cfg_output(MCP4725_I2C_SCL_PIN) // SCL pin output mode -#define SDA_IN() nrf_gpio_cfg_input(MCP4725_I2C_SDA_PIN, NRF_GPIO_PIN_NOPULL) // SDA pin input mode -#define SDA_READ() nrf_gpio_pin_read(MCP4725_I2C_SDA_PIN) // SDA pin read -#define SCL_READ() nrf_gpio_pin_read(MCP4725_I2C_SCL_PIN) // SCL pin read -#define i2c_delay() nrf_delay_us(1) // delay time for 400khz clock 1 -#define i2c_clock() { i2c_delay(); SCL_H(); i2c_delay(); SCL_L(); } -#define i2c_start() { SDA_H(); i2c_delay(); SCL_H(); i2c_delay(); SDA_L(); i2c_delay(); SCL_L(); i2c_delay();} -#define i2c_stop() { SDA_L(); i2c_delay(); SCL_H(); i2c_delay(); SDA_H(); i2c_delay(); } - -#define TWI_WRITE 0x00 -#define TWI_READ 0x01 - -#define ACK true -#define NACK false - -#define DAC_write false -#define EEPROM_write true - -// constants -#define MCP4725_MAXVALUE 4095 - -// registerMode -#define MCP4725_DAC 0x40 -#define MCP4725_DACEEPROM 0x60 - -// reset & wake up -#define MCP4725_GC_RESET 0x06 -#define MCP4725_GC_WAKEUP 0x09 - -// powerDown Mode - TODO ENUM? -#define MCP4725_PDMODE_NORMAL 0x00 -#define MCP4725_PDMODE_1K 0x01 -#define MCP4725_PDMODE_100K 0x02 -#define MCP4725_PDMODE_500K 0x03 - -void mcp4725_i2c_initialize(void); -void mcp4725_writeFastMode(const uint16_t value); -void mcp4725_generalCall(const uint8_t gc); -void mcp4725_init(void); -void mcp4725_powerOnReset(void); -void mcp4725_powerOnWakeUp(void); -void mcp4725_PowerDownMode(void); - -/* * * * * * * * * * * * * * * * * * * * */ - -uint16_t mcp4725_readDAC(void); -bool mcp4725_ready(void); -uint16_t mcp4725_readDAC(void); -bool mcp4725_ready(void); - -void mcp4725_writeRegisterMode(const uint16_t value, uint8_t reg); -void mcp4725_readRegister(uint8_t* buffer, const uint8_t length); -void mcp4725_setValue(const uint16_t value); -uint16_t mcp4725_getValue(void); -void mcp4725_setPercentage(float percentage); -void mcp4725_writeDAC(const uint16_t value, const bool EEPROM); -uint16_t mcp4725_readEEPROM(void); -void mcp4725_writePowerDownMode(const uint8_t PDM, const bool EEPROM); -uint8_t mcp4725_readPowerDownModeEEPROM(void); -uint8_t mcp4725_readPowerDownModeDAC(void); - - - -void DS3930_write(uint8_t id, uint8_t addr, uint8_t wdata); -uint8_t DS3930_read(uint8_t id, uint8_t addr, uint8_t* rdata); - - -#endif /* !_MCP4725_I2C_H_ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_48.c b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_48.c deleted file mode 100644 index 56b6468..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_48.c +++ /dev/null @@ -1,913 +0,0 @@ -/******************************************************************************* - TEST medi50 Dec 23 - mmeas_pd_48.c - ******************************************************************************/ -#include "sdk_common.h" - -#include -#include -#include -#include -#include "nrf.h" -#include "boards.h" -#include "app_error.h" -#include "nrf_drv_saadc.h" -#include "nrfx_gpiote.h" -#include "app_timer.h" -#include "nrf_drv_timer.h" -#include "nrf_delay.h" -#include "nrf_drv_ppi.h" -#include "ada2200_spi.h" -#include "ble_nus.h" -//#include "fstorage.h" -#include "measurements.h" -#include "meas_pd_48.h" -#include "mcp4725_i2c.h" -#include "ad5272_i2c.h" -#include "main_timer.h" -#include "battery_saadc.h" -#include "tmp235_q1.h" -#include "main.h" -#include "app_raw_main.h" -#include -#include "debug_print.h" - - - - -extern bool info4; //cmd_parse add 3other items. -uint8_t ADC_PD_MODE = 0; //0: Full 1: Full Continuous 2: HALF 1 3: HALF 1 Continuous 4: Half2 5: Half 2 Countiuous. -uint8_t m48_samples_in_buffer = 8; -uint8_t CURRENT_LED_NO = 24;//48 -//uint8_t CURRENT_list_m48[m48_LED_NO]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; -uint8_t CURRENT_list_m48[m48_LED_NO]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23}; - //uint32_t s_cnt; -//static const uint8_t LED_list_m48[m48_LED_NO]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; -static const uint8_t LED_list_m48[m48_LED_NO]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23}; -static const uint8_t LED_list_m48_1h[m48_LED_NO_H] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23}; -static const uint8_t LED_list_m48_2h[m48_LED_NO_H] = {24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; -extern uint16_t m_pd_delay_us; -//int32_t c_max; -extern volatile bool processing; -extern volatile bool data_tx_in_progress; -extern volatile bool ble_connection_st; -extern bool go_temp; -extern bool go_batt; -//extern bool ble_got_new_data; -////extern bool motion_data_once; -uint16_t volatile info_batt = 0; - -uint16_t volatile info_temp = 0; - -uint16_t volatile info_imu[6]={0,1,2,3,4,5}; -// new add Pressure -uint16_t volatile info_p1 = 0; -uint16_t volatile info_p2 = 0; - -uint32_t m48_cnt; -static int8_t pd_no = -1; -static int8_t led_no = -1; -static int8_t buf_no = 0; -//static int8_t order = 0; - - -//static int8_t c_max = 5; -static int32_t t_ms = 0; -uint8_t order_pd=0; - - -/* /int16_t buff_m48_cycle_old[48][m48_CYCLE_CNT] = -// { -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //0 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //1 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //2 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //3 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //4 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //5 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //6 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //7 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //8 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //9 -// - -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //0 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //1 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //2 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //3 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //4 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //5 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //6 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //7 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //8 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //9 -// -// -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //0 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //1 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //2 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //3 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //4 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //5 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //6 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //7 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //8 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //9 -// -// -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //0 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //1 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //2 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //3 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //4 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //5 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //6 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //7 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //8 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //9 -// -// - -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //0 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //1 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //2 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //3 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //4 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //5 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //6 -// {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //7 - -// }; */ -int16_t buff_m48_cycle[m48_LED_NO][m48_CYCLE_CNT] = - { - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //0 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //9 - - - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //0 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //9 - - - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //0 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}, //3 - - }; - - - -//int16_t m48_cycle_send_buff[m48_LED_NO] = {0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0} -int16_t m48_cycle_send_buff[m48_LED_NO] = {0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0,}; //24 size - -//int16_t buff_cycle_send_buff1[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff2[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff3[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff4[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff5[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff6[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff7[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff8[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff9[buff_LED_NO] = {0, }; -// uint16_t bi_buff_cycle_send_buff[10][m48_LED_NO] = { -// {0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0 -// ,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0}, -// }; -//uint16_t single_bi_m48_cycle_send_buff[m48_LED_NO] = - //{0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0}; - uint16_t single_bi_m48_cycle_send_buff[m48_LED_NO] = - {0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0}; //24 ==old is 48 -#define SAMPLES_IN_BUFFER 4095+32 -static nrf_saadc_value_t pd_m48_adc_buf[2][SAMPLES_IN_BUFFER]; -//uint16_t single_info_m48_cycle_send_buff[56] ={0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, - // 0, 0, 0, 0,0 }; - - uint16_t single_info_m48_cycle_send_buff[24] ={0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0}; //edit cj 56-->24 -//bool pd_adc_custom_a_start = false; -//bool pd_adc_custom_b_start = false; -//bool pd_adc_custom_c_start = false; -//bool pd_adc_custom_d_start = false; -//bool pd_adc_custom_end = false; -//bool pd_adc_custom_start = false; -bool pd_adc_m48_start = false; -bool pd_adc_m48_running = false; -bool m48_testing = false; - -// -//bool custom_add_data; -extern bool ble_got_new_data; -extern bool motion_raw_data_enabled; -//extern char ble_tx_buffer[BLE_NUS_MAX_DATA_LEN]; -uint8_t m48_bin_buffer[BLE_NUS_MAX_DATA_LEN]; -//add imu - - - - - - -extern which_cmd_t cmd_type_t; - -APP_TIMER_DEF(m_m48_check_loop_timer_id); -//APP_TIMER_DEF(m_m48_send_loop_timer_id); -#if FEATURE_DELAY -#define m48_SEND_LOOP_INTERVAL 500 -#else -#define m48_SEND_LOOP_INTERVAL 100 //100 cj chun -#endif -#define m48_CHECK_LOOP_INTERVAL 1 //1 - - - -static nrf_ppi_channel_t m_ppi_channel; - - - -#if !FEATURE_PRINTF -void m48_ppi_init(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_init(); - APP_ERROR_CHECK(err_code); - - uint32_t gpiote_event_addr = nrf_drv_gpiote_in_event_addr_get(ADA2200_SYNCO_PIN); - uint32_t saadc_sample_task_addr = nrf_drv_saadc_sample_task_get(); - - /* setup ppi channel so that timer compare event is triggering sample task in SAADC */ - err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_ppi_channel_assign(m_ppi_channel, - gpiote_event_addr, - saadc_sample_task_addr); - APP_ERROR_CHECK(err_code); -} - - -void m48_ppi_uninit(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_uninit(); - APP_ERROR_CHECK(err_code); -} - - -void m48_sampling_event_enable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} - - -void m48_sampling_event_disable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_disable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} -#endif - - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void m48_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* PD Voltage reading */ -{ - ret_code_t err_code; - int16_t sum = 0; - - uint32_t m48_clk_delay = m_pd_delay_us/16; - - if(ble_connection_st == 0) { - //imm_adc_end(); - //custom_send_timer_stop(); - DBG_PRINTF("m48 ADC STOP 1\r\n"); - - - led_off(99); - pd_off(99); - pd_adc_m48_start=false; - pd_adc_m48_running=false; - m48_testing = false; - info4 = false; - DBG_PRINTF ("LOST_AT48\r\n"); - processing = false; - go_batt = false; - go_temp = false; - m48_adc_end_final(); - } - - else{ - if (p_event->type == NRF_DRV_SAADC_EVT_DONE) - { - err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, m48_samples_in_buffer + m48_clk_delay); - APP_ERROR_CHECK(err_code); - - if(led_no == -1) { - led_no = 0; - pd_no = 0; - - led_on(CURRENT_list_m48[led_no]); - led_pd_matching_value_set(CURRENT_list_m48[led_no]); /* MCP4725 DAC setting and PD on */ - - } else { - - for(uint16_t i = m48_clk_delay; i < m48_clk_delay + m48_samples_in_buffer; i++){ - buff_m48_cycle[buf_no][i-m48_clk_delay] = p_event->data.done.p_buffer[i]; - } -#if FEATURE_PRINTF - DBG_PRINTF("-----------------Read ADC // led_no = %d(%d), pd_no = %d(%d), buf_no = %d\r\n\r\n", led_no, LED_list_m48[led_no], pd_no, PD_list_m48[pd_no], buf_no); -#endif - - buf_no++; - - if(pd_no >= - 1) { - //pd_no = 0; - - - - if(led_no < CURRENT_LED_NO - 1) { - led_no++; - led_on(CURRENT_list_m48[led_no]); - led_pd_matching_value_set(CURRENT_list_m48[led_no]); /* MCP4725 DAC setting and PD on */ - - } else if(led_no >= CURRENT_LED_NO - 1) { - pd_no = -1; - led_no = -1; -#if FEATURE_PRINTF - DBG_PRINTF("\r\nEnded\r\n"); -#endif - //imm_adc_end(); - //imm_adc_end_final(); - - /////////////////////////////////////////////////////////////////////////////////////////// - uint8_t k =0; - sum = 0; - for(uint16_t i = 0; i < CURRENT_LED_NO; i++){ - for(uint16_t j = 0; j < m48_samples_in_buffer; j++){ - sum += buff_m48_cycle[i][j]; - } - - m48_cycle_send_buff[k++] = sum; - sum = 0; - } - - buf_no = 0; - - if(ble_connection_st == 0) { - - DBG_PRINTF("m24 ADC STOP 1"); -// pd_adc_m48_start=false; -// pd_adc_m48_running=false; -// DBG_PRINTF ("FINISH SEND\r\n"); -// -// m48_testing = false; -// m48_adc_end_final(); - } - else { - pd_adc_m48_start=false; - - DBG_PRINTF ("FINISH SEND\r\n"); - m48_testing = false; - //m48_adc_end_final(); - if(cmd_type_t == CMD_UART) { - //custom_send_timer_stop(); - - }else if(cmd_type_t == CMD_BLE) { - // DBG_PRINTF("%d ms \r\n",t_ms); - //DBG_PRINTF("value 4: %d,%d,%d,%d \r\n",imm_cycle_send_buff[0] ,imm_cycle_send_buff[1] ,imm_cycle_send_buff[2] ,imm_cycle_send_buff[3] ); - for(uint16_t i = 0; i < CURRENT_LED_NO; i++){ - DBG_PRINTF("%d,",m48_cycle_send_buff[i]); - //bi_m48_cycle_send_buff[m48_cnt][i]=(uint16_t)(m48_cycle_send_buff[i]); - - single_bi_m48_cycle_send_buff[i]=(uint16_t)(m48_cycle_send_buff[i]); - } - - if (info4 == true){ - - single_info_m48_cycle_send_buff[0] = info_batt; - single_info_m48_cycle_send_buff[1] = info_temp; - for(uint16_t i = 0; i < 6; i++) - single_info_m48_cycle_send_buff[i+2]= info_imu[i]; - - single_info_m48_cycle_send_buff[8] = info_p1; //add cj 25/11/24 - single_info_m48_cycle_send_buff[9] = info_p2; //add cj 25/11/24 - - for(uint16_t i = 0; i < CURRENT_LED_NO; i++){ - single_info_m48_cycle_send_buff[i+10]= single_bi_m48_cycle_send_buff[i]; - } - if(ADC_PD_MODE==0){ - - format_data(m48_bin_buffer, "rsj:", single_info_m48_cycle_send_buff, 56); //MEASURE ADC 24 48+6+2 - binary_tx_handler(m48_bin_buffer,58); - } - else if(ADC_PD_MODE==2){ - - format_data(m48_bin_buffer, "rcj:", single_info_m48_cycle_send_buff, 34); //24(pd)+6(imu)+2(pressure p1p2) - binary_tx_handler(m48_bin_buffer,36); - } - else if(ADC_PD_MODE==3){ - - format_data(m48_bin_buffer, "rdj:", single_info_m48_cycle_send_buff, 34); //24(pd)+6(imu)+2(pressure p1p2) - binary_tx_handler(m48_bin_buffer,36); - } - else if(ADC_PD_MODE==4){ - - format_data(m48_bin_buffer, "rej:", single_info_m48_cycle_send_buff, 34); //24(pd)+6(imu)+2(pressure p1p2) - binary_tx_handler(m48_bin_buffer,36); - } - else if(ADC_PD_MODE==5){ - - format_data(m48_bin_buffer, "rfj:", single_info_m48_cycle_send_buff, 34); //24(pd)+6(imu)+2(pressure p1p2) - binary_tx_handler(m48_bin_buffer,36); - } - else { -// format_data(m48_bin_buffer, "rsj:", single_info_m48_cycle_send_buff, 56); -// binary_tx_handler(m48_bin_buffer,56); - } - - } - - - - - else{ - - char resp[4]; - - - - if(ADC_PD_MODE==2){ - - format_data(m48_bin_buffer, "rdj:", single_bi_m48_cycle_send_buff, 24); - binary_tx_handler(m48_bin_buffer,26); - - } - - else if(ADC_PD_MODE==4){ - - format_data(m48_bin_buffer, "rfj:", single_bi_m48_cycle_send_buff, 24); - binary_tx_handler(m48_bin_buffer,26); - - } - else if(ADC_PD_MODE==3){ - sprintf(resp,"rd%01X:", order_pd); - format_data(m48_bin_buffer, resp, single_bi_m48_cycle_send_buff, 24); - binary_tx_handler(m48_bin_buffer,26); - } - - else if(ADC_PD_MODE==4){ - - format_data(m48_bin_buffer, "rej:", single_bi_m48_cycle_send_buff, 24); - binary_tx_handler(m48_bin_buffer,26); - } - - else if(ADC_PD_MODE==5){ - sprintf(resp,"rf%01X:", order_pd); - format_data(m48_bin_buffer, resp, single_bi_m48_cycle_send_buff, 24); - binary_tx_handler(m48_bin_buffer,26); - } - - - - - else { -// format_data(m48_bin_buffer, "rtj:", single_bi_m48_cycle_send_buff, 48); -// binary_tx_handler(m48_bin_buffer,50); - } - } - - - DBG_PRINTF("\r\n %d ms \r\n",t_ms); -// format_data(buff_bin_buffer, "rjb:", bi_buff_cycle_send_buff, 200); -// // -// binary_tx_handler(buff_bin_buffer,102); - } - -// if(ble_connection_st == 1) { -// battery_timer_start(); -// } - - - - - if (pd_adc_m48_running==true){ - - - - //m48_adc_end_final(); - - if(info4 == true){ - m48_adc_end_final(); - pd_adc_m48_start=true; - go_batt = true; // BATT.TEMP IMU - //motion_raw_data_enabled = true;//only IMU - main_timer_start(); - - } - else{t_ms=0; - m48_cnt=0; - m48_testing = true; - // - //processing = false; - m48_adc_start(); - - - } - - - } - else - { - if(info4 == true){ //for single shot - info4 = false; - } - led_off(99); - pd_off(99); - processing = false; - m48_adc_end_final(); - } - } - } - } - } - } - } -} - -void m48_check_loop(void * p_context) -{ - UNUSED_PARAMETER(p_context); - m48_check_timer_stop(); - if ( m48_testing == false) - { - DBG_PRINTF("%d ms \r\n",t_ms); - // sprintf(custom_tx_buffer, "Measure Time :%d ms \r\n",t_ms); - } - else - { - t_ms++; - m48_check_timer_start(); - } -} -//void m48_send_loop(void * p_context) /* For x ms */ -//{ -// UNUSED_PARAMETER(p_context); -// m48_send_timer_stop(); -// - -// - - - - - -// order++; -// if(ble_connection_st == BLE_DISCONNECTED_ST) { -// // order=0; -// // full_send_timer_stop(); -// // DBG_PRINTF("Full ADC STOP 2\r\n"); -// -// } -// else{ -// -// } -//} - - - -void m48_adc_start_init(void) -{ - if (ble_got_new_data ==true) - { - if (pd_adc_m48_running==true){ - - - led_off(99); - pd_off(99); - pd_adc_m48_start=false; - pd_adc_m48_running=false; - DBG_PRINTF ("FINISH NEWDATA\r\n"); - processing = false; - go_batt = false; - go_temp = false; - //pd_adc_m48_running=false; - //motion_data_once = true; - motion_raw_data_enabled = false; - m48_testing = false; - if(info4 == true){ //for complex continous - info4 = false; - } - else { - m48_adc_end_final(); //normal contuion - } - } - } -// else if (pd_adc_m48_running==true){ -// -// info4 = true; -// t_ms=0; -// m48_cnt=0; -// m48_testing = true; -// // -// //processing = false; -// m48_adc_start(); -// //m48_adc_end_final(); -// -// -// } - else if (pd_adc_m48_start==true) - { - - - switch (ADC_PD_MODE) - { - case 0: - pd_adc_m48_running=false; - CURRENT_LED_NO = m48_LED_NO; - for(uint16_t i = 0; i < CURRENT_LED_NO; i++) { - CURRENT_list_m48[i] = LED_list_m48[i]; - } - break; - - case 1: - pd_adc_m48_running=true; - CURRENT_LED_NO = m48_LED_NO; - for(uint16_t i = 0; i < CURRENT_LED_NO; i++) { - CURRENT_list_m48[i] = LED_list_m48[i]; - } - break; - - case 2: - pd_adc_m48_running=false; - CURRENT_LED_NO = m48_LED_NO_H; - for(uint16_t i = 0; i < CURRENT_LED_NO; i++) { - CURRENT_list_m48[i] = LED_list_m48_1h[i]; - } - break; - - case 3: - pd_adc_m48_running=true; - CURRENT_LED_NO = m48_LED_NO_H; - for(uint16_t i = 0; i < CURRENT_LED_NO; i++) { - - CURRENT_list_m48[i] = LED_list_m48_1h[i]; - - } - break; - - case 4: - pd_adc_m48_running=false; - CURRENT_LED_NO = m48_LED_NO_H; - for(uint16_t i = 0; i < CURRENT_LED_NO; i++) { - CURRENT_list_m48[i] = LED_list_m48_2h[i]; - DBG_PRINTF("%d,",CURRENT_list_m48[i]); - } - break; - - case 5: - pd_adc_m48_running=true; - CURRENT_LED_NO = m48_LED_NO_H; - for(uint16_t i = 0; i < CURRENT_LED_NO; i++) { - CURRENT_list_m48[i] = LED_list_m48_2h[i]; - } - break; - - - - - default: - pd_adc_m48_running=false; - CURRENT_LED_NO = m48_LED_NO; - for(uint16_t i = 0; i < CURRENT_LED_NO; i++) { - CURRENT_list_m48[i] = LED_list_m48[i]; - - break; - } - - } - t_ms=0; - m48_cnt=0; - pd_adc_m48_start=false; - - m48_testing = true; -// custom_check_timer_start(); - // c_cnt=0; -// pd_adc_custom_start=false; -// pd_adc_custom_a_start=true; - -// static const uint8_t LED_list_m48[m48_LED_NO]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23, 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; -//static const uint8_t LED_list_m48_1h[m48_LED_NO_H] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23}; -//static const uint8_t LED_list_m48_2h[m48_LED_NO_H] = {24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; -// uint8_t ADC_PD_MODE = 0; //0: Full 1: Full Continuous 2: HALF 1 3: HALF 1 Continuous 4: Half2 5: Half 2 Countiuous. - m48_adc_start2(); - m48_check_timer_start(); - // c_cnt++; - } - - - - -else - { - - } -} - - - -void m48_adc_start(void) -{ - pd_no = -1; - led_no = -1; - buf_no = 0; - - - - for(uint16_t i = 0; i < m48_LED_NO; i++) { //ok - for(uint16_t j = 0; j < m48_CYCLE_CNT; j++) { - buff_m48_cycle[i][j] = 0; - - if (ble_got_new_data ==true){ - if (pd_adc_m48_running==true){ - - -// led_off(99); -// pd_off(99); - pd_adc_m48_start=false; - pd_adc_m48_running=false; - } - - } - } - } - - if(order_pd>=15){ - order_pd=0; -} -else -{ order_pd++; -} - - -} - - -void m48_adc_start2(void) -{ - m48_adc_start(); - m48_adc_init(); - m48_irq_init(); - m48_ppi_init(); - m48_sampling_event_enable(); - -} - - -void m48_adc_end(void) -{ - - DBG_PRINTF("m48_adc_end\r\n"); - - m48_sampling_event_disable(); - -} - -void m48_adc_end_final(void) -{ - DBG_PRINTF("adc_end_final\r\n"); - m48_sampling_event_disable(); - m48_irq_uninit(); - m48_ppi_uninit(); - m48_adc_uninit(); - battery_timer_start(); -} - - -void m48_adc_init(void) -{ -#if FEATURE_PRINTF - DBG_PRINTF("m48_adc_init\r\n"); -#endif - - static nrfx_saadc_config_t default_config; - default_config.resolution = (nrf_saadc_resolution_t)NRFX_SAADC_CONFIG_RESOLUTION; /* Resolution is 10bits */ - default_config.oversample = (nrf_saadc_oversample_t)NRFX_SAADC_CONFIG_OVERSAMPLE; /* Over Sampling Disabled */ - default_config.interrupt_priority = NRFX_SAADC_CONFIG_IRQ_PRIORITY; /* Interrupt Priority is 0(Highest) */ - default_config.low_power_mode = NRFX_SAADC_CONFIG_LP_MODE; /* Low Power Mode is Disabled */ - - static nrf_saadc_channel_config_t config; - config.resistor_p = NRF_SAADC_RESISTOR_DISABLED; - config.resistor_n = NRF_SAADC_RESISTOR_DISABLED; - config.gain = NRF_SAADC_GAIN1_6; - config.reference = NRF_SAADC_REFERENCE_INTERNAL; - config.acq_time = NRF_SAADC_ACQTIME_3US; - config.mode = NRF_SAADC_MODE_DIFFERENTIAL; - config.burst = NRF_SAADC_BURST_DISABLED; - config.pin_p = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN0); - config.pin_n = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN1); - - ret_code_t err_code = nrf_drv_saadc_init(&default_config, m48_voltage_handler); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_channel_init(0, &config); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_buffer_convert(pd_m48_adc_buf[0], m48_samples_in_buffer + m_pd_delay_us/16); - APP_ERROR_CHECK(err_code); -} - - - -void m48_adc_uninit(void) -{ -#if FEATURE_PRINTF - DBG_PRINTF("pd_m48_adc_uninit\r\n"); -#endif - - nrf_drv_saadc_uninit(); - nrf_drv_saadc_channel_uninit(0); -} - - -#if !FEATURE_PRINTF -void m48_irq_init(void) -{ - ret_code_t err_code; - - /* Initialize int pin */ - if (!nrfx_gpiote_is_init()) - { - err_code = nrfx_gpiote_init(); - APP_ERROR_CHECK(err_code); - } - - nrfx_gpiote_in_config_t in_config = NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(true); - in_config.pull = NRF_GPIO_PIN_PULLDOWN; - - err_code = nrfx_gpiote_in_init(ADA2200_SYNCO_PIN, &in_config, NULL); - APP_ERROR_CHECK(err_code); - - nrfx_gpiote_in_event_enable(ADA2200_SYNCO_PIN, true); -} - - -void m48_irq_uninit(void) -{ - nrfx_gpiote_in_event_disable(ADA2200_SYNCO_PIN); - nrfx_gpiote_in_uninit(ADA2200_SYNCO_PIN); -} -#endif - - -// void m48_send_timer_start(void) -// { -// APP_ERROR_CHECK(app_timer_start(m_m48_send_loop_timer_id, APP_TIMER_TICKS(m48_SEND_LOOP_INTERVAL), NULL)); -// } - - -// void m48_send_timer_stop(void) -// { -// APP_ERROR_CHECK(app_timer_stop(m_m48_send_loop_timer_id)); - -// } - - -// void m48_send_timer_init(void) -// { -// APP_ERROR_CHECK(app_timer_create(&m_m48_send_loop_timer_id, APP_TIMER_MODE_SINGLE_SHOT, m48_send_loop)); -// } - - -void m48_check_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_m48_check_loop_timer_id, APP_TIMER_TICKS(m48_CHECK_LOOP_INTERVAL), NULL)); -} - -void m48_check_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_m48_check_loop_timer_id)); - -} -void m48_check_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_m48_check_loop_timer_id, APP_TIMER_MODE_SINGLE_SHOT, m48_check_loop)); -} diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_48.h b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_48.h deleted file mode 100644 index 2a6d664..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_48.h +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************* - * @file meas_pd_48.h - - ******************************************************************************/ - -#ifndef _MEAS_PD_48_H__ -#define _MEAS_PD_48_H__ - -#include "sdk_common.h" -#include "nrf_drv_saadc.h" - -#define ADA2200_SYNCO_PIN NRF_GPIO_PIN_MAP(0,17) - - -#define m48_PD_NO 1 /////4 -#define m48_LED_NO 24 ////5 ///48 cj edit 25/10/14 -#define m48_LED_NO_H 24 ////5 -#define m48_CYCLE_CNT 32 ////32 - - -void m48_ppi_init(void); -void m48_ppi_uninit(void); -void m48_sampling_event_enable(void); -void m48_sampling_event_disable(void); - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void m48_voltage_handler(nrf_drv_saadc_evt_t const * p_event); /* PD Voltage reading */ -void m48_adc_start_init(void); -void m48_adc_start(void); -void m48_adc_start2(void); -//void custom_adc_start2(void); -//void custom_adc_total_start(void); -void m48_adc_end(void); -void m48_adc_end_final(void); -void m48_adc_init(void); -void m48_adc_uninit(void); - -void m48_irq_init(void); -void m48_irq_uninit(void); - -// void bm48_send_start(void); - -// void m48_send_loop(void * p_context); /* For x ms */ -// void m48f_send_timer_start(void); -// void m48_send_timer_stop(void);; -// void m48_send_timer_init(void); - - -void m48_check_loop(void * p_context); -void m48_check_timer_start(void); -void m48_check_timer_stop(void);; -void m48_check_timer_init(void); - -#endif /* _MEAS_PD_48_H__ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_buff.c b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_buff.c deleted file mode 100644 index 5eede51..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_buff.c +++ /dev/null @@ -1,785 +0,0 @@ -/******************************************************************************* - TEST medi50 Dec 23 - ******************************************************************************/ -#include "sdk_common.h" - -#include -#include -#include -#include -#include "nrf.h" -#include "boards.h" -#include "app_error.h" -#include "nrf_drv_saadc.h" -#include "nrfx_gpiote.h" -#include "app_timer.h" -#include "nrf_drv_timer.h" -#include "nrf_delay.h" -#include "nrf_drv_ppi.h" -#include "ada2200_spi.h" -#include "ble_nus.h" -//#include "fstorage.h" -#include "measurements.h" -#include "meas_pd_buff.h" -#include "mcp4725_i2c.h" -#include "ad5272_i2c.h" -#include "main_timer.h" -#include "battery_saadc.h" -#include "main.h" -#include "app_raw_main.h" - -//#define CUSTOM_REF_VOLTAGE_IN_MILLIVOLTS 600.0f /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ -//#define CUSTOM_PRE_SCALING_COMPENSATION 6.0f /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/ -//#define CUSTOM_ADC_RES_10BITS 1024.0f /**< Maximum digital value for 10-bit ADC conversion. */ -//#define st_c_max 20 -///**@brief Macro to convert the result of ADC conversion in millivolts. -// * -// * @param[in] ADC_VALUE ADC result. -// * -// * @retval Result converted to millivolts. -// */ -//#define CUSTOM_VOUT_IN_MILLI_VOLTS(ADC_VALUE)\ -// (((((ADC_VALUE) * CUSTOM_REF_VOLTAGE_IN_MILLIVOLTS) / CUSTOM_ADC_RES_10BITS) * CUSTOM_PRE_SCALING_COMPENSATION)*2) - -uint16_t b_t_cnt=5; -uint8_t buff_samples_in_buffer = 8; - -//uint32_t s_cnt; -uint8_t LED_list_buff[buff_LED_NO]={0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0 -,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0}; -//uint8_t PD_list_custom[4]; - -//uint8_t led_custom_list_a[5] = {2,3,4,5,6}; -//uint8_t pd_custom_list_a[4] = {5,7,8,10}; - -//uint8_t led_custom_list_b[5] = {20,21,22,23,24}; -//uint8_t pd_custom_list_b[4] = {16,14,13,11}; - -//int32_t c_max; -extern volatile bool processing; -extern volatile bool data_tx_in_progress; -extern volatile bool ble_connection_st; - - -uint32_t buff_cnt; -static int8_t pd_no = -1; -static int8_t led_no = -1; -static int8_t buf_no = 0; -static int8_t order = 0; -uint16_t bsel_led_index0 =0; -uint16_t bsel_led_index1 =1; -uint16_t bsel_led_index2 =2; -uint16_t bsel_led_index3 =3; - - -static int32_t t_ms = 0; -int16_t buff_cycle_buff[buff_LED_NO][buff_CYCLE_CNT] = - { - {0, 0, 0, 0, 0, 0, 0, 0}, //0 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0}, //10 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0}, //20 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0}, //30 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0}, //40 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0}, //50 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0}, //60 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0}, //70 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0}, //80 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0}, //90 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0}, //9 - }; -int16_t buff_cycle_send_buff[buff_LED_NO] = {0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0 -,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0}; -//int16_t buff_cycle_send_buff1[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff2[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff3[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff4[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff5[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff6[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff7[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff8[buff_LED_NO] = {0, }; -//int16_t buff_cycle_send_buff9[buff_LED_NO] = {0, }; -uint16_t bi_buff_cycle_send_buff[60][buff_LED_NO] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0 -,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0}, - }; -uint16_t single_bi_buff_cycle_send_buff[buff_LED_NO] = - {0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0 -,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0,0, 0, 0, 0, 0, 0, 0, 0, 0,0}; -#define SAMPLES_IN_BUFFER 4095+32 -static nrf_saadc_value_t pd_buff_adc_buf[2][SAMPLES_IN_BUFFER]; - -//bool pd_adc_custom_a_start = false; -//bool pd_adc_custom_b_start = false; -//bool pd_adc_custom_c_start = false; -//bool pd_adc_custom_d_start = false; -//bool pd_adc_custom_end = false; -//bool pd_adc_custom_start = false; -bool pd_adc_buff_start = false; -bool pd_adc_buff_running = false; -bool buff_testing = false; -extern uint16_t m_pd_delay_us; -// -//bool custom_add_data; -extern bool ble_got_new_data; -extern bool motion_raw_data_enabled; -//extern char ble_tx_buffer[BLE_NUS_MAX_DATA_LEN]; -uint8_t buff_bin_buffer[BLE_NUS_MAX_DATA_LEN]; -//add imu - - - - - - -extern which_cmd_t cmd_type_t; - -APP_TIMER_DEF(m_buff_check_loop_timer_id); -APP_TIMER_DEF(m_buff_send_loop_timer_id); -#if FEATURE_DELAY -#define CUSTOM_SEND_LOOP_INTERVAL 500 -#else -#define BUFF_SEND_LOOP_INTERVAL 100 -#endif -#define BUFF_CHECK_LOOP_INTERVAL 1 - - - - -static nrf_ppi_channel_t m_ppi_channel; - - - -#if !FEATURE_PRINTF -void buff_ppi_init(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_init(); - APP_ERROR_CHECK(err_code); - - uint32_t gpiote_event_addr = nrf_drv_gpiote_in_event_addr_get(ADA2200_SYNCO_PIN); - uint32_t saadc_sample_task_addr = nrf_drv_saadc_sample_task_get(); - - /* setup ppi channel so that timer compare event is triggering sample task in SAADC */ - err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_ppi_channel_assign(m_ppi_channel, - gpiote_event_addr, - saadc_sample_task_addr); - APP_ERROR_CHECK(err_code); -} - - -void buff_ppi_uninit(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_uninit(); - APP_ERROR_CHECK(err_code); -} - - -void buff_sampling_event_enable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} - - -void buff_sampling_event_disable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_disable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} -#endif - - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void buff_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* PD Voltage reading */ -{ - ret_code_t err_code; - int16_t sum = 0; - - uint32_t buff_clk_delay = m_pd_delay_us/16; - if(ble_connection_st == 0) { - //imm_adc_end(); - //custom_send_timer_stop(); - printf("Custom ADC STOP 1\r\n"); - } - - else{ - if (p_event->type == NRF_DRV_SAADC_EVT_DONE) - { - err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, buff_samples_in_buffer + buff_clk_delay); - APP_ERROR_CHECK(err_code); - - if(led_no == -1) { - led_no = 0; - pd_no = 0; - - led_on(LED_list_buff[led_no]); - led_pd_matching_value_set(LED_list_buff[led_no]); /* MCP4725 DAC setting and PD on */ - - } else { - - for(uint16_t i = buff_clk_delay; i < buff_clk_delay + buff_samples_in_buffer; i++){ - buff_cycle_buff[buf_no][i-buff_clk_delay] = p_event->data.done.p_buffer[i]; - } -#if FEATURE_PRINTF - printf("-----------------Read ADC // led_no = %d(%d), pd_no = %d(%d), buf_no = %d\r\n\r\n", led_no, LED_list_custom[led_no], pd_no, PD_list_custom[pd_no], buf_no); -#endif - - buf_no++; - - if(pd_no >= - 1) { - //pd_no = 0; - - - - if(led_no < buff_LED_NO - 1) { - led_no++; - led_on(LED_list_buff[led_no]); - led_pd_matching_value_set(LED_list_buff[led_no]); /* MCP4725 DAC setting and PD on */ - - } else if(led_no >= buff_LED_NO - 1) { - pd_no = -1; - led_no = -1; -#if FEATURE_PRINTF - printf("\r\nEnded\r\n"); -#endif - //imm_adc_end(); - //imm_adc_end_final(); - - /////////////////////////////////////////////////////////////////////////////////////////// - uint8_t k =0; - sum = 0; - for(uint16_t i = 0; i < buff_LED_NO; i++){ - for(uint16_t j = 0; j < buff_samples_in_buffer; j++){ - sum += buff_cycle_buff[i][j]; - } - - buff_cycle_send_buff[k++] = sum; - sum = 0; - } - - - - - buf_no = 0; - - if(ble_connection_st == 0) { - - printf("Custom ADC STOP 1"); - pd_adc_buff_start=false; - pd_adc_buff_running=false; - printf ("FINISH SEND\r\n"); - processing = false; - buff_testing = false; - buff_adc_end_final(); - } - else { - - - if(cmd_type_t == CMD_UART) { - //custom_send_timer_stop(); - - }else if(cmd_type_t == CMD_BLE) { - // printf("%d ms \r\n",t_ms); - //printf("value 4: %d,%d,%d,%d \r\n",imm_cycle_send_buff[0] ,imm_cycle_send_buff[1] ,imm_cycle_send_buff[2] ,imm_cycle_send_buff[3] ); - for(uint16_t i = 0; i < buff_LED_NO; i++){ - printf("%d,",buff_cycle_send_buff[i]); - bi_buff_cycle_send_buff[buff_cnt][i]=(uint16_t)(buff_cycle_send_buff[i]); - //single_bi_buff_cycle_send_buff[i]=(uint16_t)(buff_cycle_send_buff[i]); - - } - printf("%d ms \r\n",t_ms); -// format_data(buff_bin_buffer, "rjb:", bi_buff_cycle_send_buff, 200); -// -// -// binary_tx_handler(buff_bin_buffer,102); - } - -// if(ble_connection_st == 1) { -// battery_timer_start(); -// } - - led_off(99); - pd_off(99); - buff_adc_start_init(); - } - } - } - } - } - } -} - -void buff_check_loop(void * p_context) -{ - UNUSED_PARAMETER(p_context); - buff_check_timer_stop(); - if ( buff_testing == false) - { - printf("%d ms \r\n",t_ms); - // sprintf(custom_tx_buffer, "Measure Time :%d ms \r\n",t_ms); - } - else - { - t_ms++; - buff_check_timer_start(); - } -} - -void buff_send_loop(void * p_context) /* For x ms */ -{ - UNUSED_PARAMETER(p_context); - buff_send_timer_stop(); - - char resp[4]; - - if(ble_connection_st == BLE_DISCONNECTED_ST) { - // order=0; - // full_send_timer_stop(); - buff_adc_end_final(); - printf("BUFF ADC STOP 2\r\n"); - processing = false; - } - - else if(order<4){ - sprintf(resp,"r%02d:", order); - format_data(buff_bin_buffer, resp, bi_buff_cycle_send_buff[order],100); - binary_tx_handler(buff_bin_buffer,102); - order++; - buff_send_timer_start(); - } - else - { - printf("ddddd%d ms \r\n",t_ms); - processing = false; - buff_adc_end_final(); - //battery_timer_start(); - } - -} - -// switch(order) { -// case 0: -// sprintf(resp,"r%02X:", order); -// format_data(buff_bin_buffer, resp, bi_buff_cycle_send_buff[0],100); -// binary_tx_handler(buff_bin_buffer,102); -// break; - -// case 1: -// format_data(buff_bin_buffer, "rb1:", bi_buff_cycle_send_buff[1],100); -// binary_tx_handler(buff_bin_buffer,102); -// -// break; -// case 2: -// format_data(buff_bin_buffer, "rb2:", bi_buff_cycle_send_buff[2],100); -// binary_tx_handler(buff_bin_buffer,102); -// -// break; - -// case 3: -// format_data(buff_bin_buffer, "rb3:", bi_buff_cycle_send_buff[3],100); -// binary_tx_handler(buff_bin_buffer,102); -// break; - - -// case 4: -// format_data(buff_bin_buffer, "rb4:", bi_buff_cycle_send_buff[4],100); -// binary_tx_handler(buff_bin_buffer,102); -// break; -// -// case 5: -// format_data(buff_bin_buffer, "rb5:", bi_buff_cycle_send_buff[5],100); -// binary_tx_handler(buff_bin_buffer,102); -// break; -// -// -// case 6: -// format_data(buff_bin_buffer, "rb6:", bi_buff_cycle_send_buff[6],100); -// binary_tx_handler(buff_bin_buffer,102); -// break; - -// case 7: -// format_data(buff_bin_buffer, "rb7:", bi_buff_cycle_send_buff[7],100); -// binary_tx_handler(buff_bin_buffer,102); -// -// break; -// case 8: -// format_data(buff_bin_buffer, "rb8:", bi_buff_cycle_send_buff[8],100); -// binary_tx_handler(buff_bin_buffer,102); -// -// break; - -// case 9: -// format_data(buff_bin_buffer, "rb9:", bi_buff_cycle_send_buff[9],100); -// binary_tx_handler(buff_bin_buffer,102); -// break; - - -// -// -// -// -// -// case 10: -// printf("Measure Time : %d ms \r\n",t_ms); -// //sprintf(full_tx_buffer, "Measure Time :%d ms \r\n",t_ms); -// // data_tx_handler(full_tx_buffer); -// order = 0; -// return; -//#if FEATURE_PRINTF -// printf("full_send Completed\r\n"); -//#endif - - - -// default: -// -// break; -// } - - - -void buff_adc_start_init(void) -{ - if (ble_got_new_data ==true) - { - pd_adc_buff_start=false; - pd_adc_buff_running=false; - printf ("FINISH SEND\r\n"); - led_off(99); - pd_off(99); - processing = false; - buff_testing = false; - buff_adc_end_final(); - } - - else if (pd_adc_buff_running==true){ - - if(buff_cnt>=b_t_cnt){ - led_off(99); - pd_off(99); - pd_adc_buff_start=false; - pd_adc_buff_running=false; - printf ("FIFNISH SEND\r\n"); - - buff_testing = false; - - order =0; - buff_send_timer_start(); - //buff_adc_start(); - } - else{ - buff_adc_start(); - buff_cnt++; - } - } - else if (pd_adc_buff_start==true) - { -// custom_testing = false; -// motion_raw_data_enabled = true; -// custom_add_data = true; -// icm42670_main(); - for(uint8_t i =0; i < 25; i++) { - LED_list_buff[i*4] = bsel_led_index0; - LED_list_buff[i*4+1] = bsel_led_index1; - LED_list_buff[i*4+2] = bsel_led_index2; - LED_list_buff[i*4+3] = bsel_led_index3; -// data_tx_handler(ble_tx_buffer); - } - - for(uint8_t i =0; i < 60; i++) { - for(uint8_t j =0; j < 100; j++) { - bi_buff_cycle_send_buff[i][j]=0; - } - } - t_ms=0; - buff_cnt=0; - pd_adc_buff_start=false; - pd_adc_buff_running=true; - buff_testing = true; -// custom_check_timer_start(); - // c_cnt=0; -// pd_adc_custom_start=false; -// pd_adc_custom_a_start=true; - - buff_adc_start2(); - buff_check_timer_start(); - // c_cnt++; - } - - - - - else - { - - } -} - - - -void buff_adc_start(void) -{ - pd_no = -1; - led_no = -1; - buf_no = 0; - - - - for(uint16_t i = 0; i < buff_LED_NO; i++) { - for(uint16_t j = 0; j < buff_CYCLE_CNT; j++) { - buff_cycle_buff[i][j] = 0; - } - } - - - - -} - - -void buff_adc_start2(void) -{ - buff_adc_start(); - buff_adc_init(); - buff_irq_init(); - buff_ppi_init(); - buff_sampling_event_enable(); - -} - - -void buff_adc_end(void) -{ - - printf("adc_end\r\n"); - - buff_sampling_event_disable(); - -} - -void buff_adc_end_final(void) -{ - - printf("adc_end_for_good\r\n"); - - buff_sampling_event_disable(); - buff_irq_uninit(); - buff_ppi_uninit(); - buff_adc_uninit(); - - -} - - - - - - -void buff_adc_init(void) -{ -#if FEATURE_PRINTF - printf("custom_adc_init\r\n"); -#endif - - static nrfx_saadc_config_t default_config; - default_config.resolution = (nrf_saadc_resolution_t)NRFX_SAADC_CONFIG_RESOLUTION; /* Resolution is 10bits */ - default_config.oversample = (nrf_saadc_oversample_t)NRFX_SAADC_CONFIG_OVERSAMPLE; /* Over Sampling Disabled */ - default_config.interrupt_priority = NRFX_SAADC_CONFIG_IRQ_PRIORITY; /* Interrupt Priority is 0(Highest) */ - default_config.low_power_mode = NRFX_SAADC_CONFIG_LP_MODE; /* Low Power Mode is Disabled */ - - static nrf_saadc_channel_config_t config; - config.resistor_p = NRF_SAADC_RESISTOR_DISABLED; - config.resistor_n = NRF_SAADC_RESISTOR_DISABLED; - config.gain = NRF_SAADC_GAIN1_6; - config.reference = NRF_SAADC_REFERENCE_INTERNAL; - config.acq_time = NRF_SAADC_ACQTIME_3US; - config.mode = NRF_SAADC_MODE_DIFFERENTIAL; - config.burst = NRF_SAADC_BURST_DISABLED; - config.pin_p = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN0); - config.pin_n = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN1); - - ret_code_t err_code = nrf_drv_saadc_init(&default_config, buff_voltage_handler); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_channel_init(0, &config); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_buffer_convert(pd_buff_adc_buf[0], buff_samples_in_buffer + m_pd_delay_us/16); - APP_ERROR_CHECK(err_code); -} - - - -void buff_adc_uninit(void) -{ -#if FEATURE_PRINTF - printf("pd_custom_adc_uninit\r\n"); -#endif - - nrf_drv_saadc_uninit(); - nrf_drv_saadc_channel_uninit(0); -} - - -#if !FEATURE_PRINTF -void buff_irq_init(void) -{ - ret_code_t err_code; - - /* Initialize int pin */ - if (!nrfx_gpiote_is_init()) - { - err_code = nrfx_gpiote_init(); - APP_ERROR_CHECK(err_code); - } - - nrfx_gpiote_in_config_t in_config = NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(true); - in_config.pull = NRF_GPIO_PIN_PULLDOWN; - - err_code = nrfx_gpiote_in_init(ADA2200_SYNCO_PIN, &in_config, NULL); - APP_ERROR_CHECK(err_code); - - nrfx_gpiote_in_event_enable(ADA2200_SYNCO_PIN, true); -} - - -void buff_irq_uninit(void) -{ - nrfx_gpiote_in_event_disable(ADA2200_SYNCO_PIN); - nrfx_gpiote_in_uninit(ADA2200_SYNCO_PIN); -} -#endif - - -void buff_send_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_buff_send_loop_timer_id, APP_TIMER_TICKS(BUFF_SEND_LOOP_INTERVAL), NULL)); -} - - -void buff_send_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_buff_send_loop_timer_id)); - -} - - -void buff_send_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_buff_send_loop_timer_id, APP_TIMER_MODE_SINGLE_SHOT, buff_send_loop)); -} - - -void buff_check_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_buff_check_loop_timer_id, APP_TIMER_TICKS(BUFF_CHECK_LOOP_INTERVAL), NULL)); -} - -void buff_check_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_buff_check_loop_timer_id)); - -} -void buff_check_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_buff_check_loop_timer_id, APP_TIMER_MODE_SINGLE_SHOT, buff_check_loop)); -} diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_buff.h b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_buff.h deleted file mode 100644 index eed749f..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_buff.h +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************************* - * @file meas_pd_buff.h - - ******************************************************************************/ - -#ifndef _MEAS_PD_BUFF_H__ -#define _MEAS_PD_BUFF_H__ - -#include "sdk_common.h" -#include "nrf_drv_saadc.h" - -#define ADA2200_SYNCO_PIN NRF_GPIO_PIN_MAP(0,17) - - -#define buff_PD_NO 1/////4 -#define buff_LED_NO 100////5 -#define buff_CYCLE_CNT 8 ////32 - - -void buff_ppi_init(void); -void buff_ppi_uninit(void); -void buff_sampling_event_enable(void); -void buff_sampling_event_disable(void); - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void buff_voltage_handler(nrf_drv_saadc_evt_t const * p_event); /* PD Voltage reading */ -void buff_adc_start_init(void); -void buff_adc_start(void); -void buff_adc_start2(void); -//void custom_adc_start2(void); -//void custom_adc_total_start(void); -void buff_adc_end(void); -void buff_adc_end_final(void); -void buff_adc_init(void); -void buff_adc_uninit(void); - -void buff_irq_init(void); -void buff_irq_uninit(void); - -void buff_send_start(void); - -void buff_send_loop(void * p_context); /* For x ms */ -void buff_send_timer_start(void); -void buff_send_timer_stop(void);; -void buff_send_timer_init(void); - - -void buff_check_loop(void * p_context); -void buff_check_timer_start(void); -void buff_check_timer_stop(void);; -void buff_check_timer_init(void); - -#endif /* _MEAS_PD_buff_H__ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_imm.c b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_imm.c deleted file mode 100644 index 609df15..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_imm.c +++ /dev/null @@ -1,522 +0,0 @@ -/******************************************************************************* - TEST medi50 Dec 23 - ******************************************************************************/ -#include "sdk_common.h" - -#include -#include -#include -#include -#include "nrf.h" -#include "boards.h" -#include "app_error.h" -#include "nrf_drv_saadc.h" -#include "nrfx_gpiote.h" -#include "app_timer.h" -#include "nrf_drv_timer.h" -#include "nrf_delay.h" -#include "nrf_drv_ppi.h" -#include "ada2200_spi.h" -#include "ble_nus.h" -//#include "fstorage.h" -#include "measurements.h" -#include "meas_pd_imm.h" -#include "mcp4725_i2c.h" -#include "ad5272_i2c.h" -#include "main_timer.h" -#include "battery_saadc.h" -#include "main.h" -#include "app_raw_main.h" -#include "debug_print.h" -//#define CUSTOM_REF_VOLTAGE_IN_MILLIVOLTS 600.0f /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ -//#define CUSTOM_PRE_SCALING_COMPENSATION 6.0f /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/ -//#define CUSTOM_ADC_RES_10BITS 1024.0f /**< Maximum digital value for 10-bit ADC conversion. */ -//#define st_c_max 20 -///**@brief Macro to convert the result of ADC conversion in millivolts. -// * -// * @param[in] ADC_VALUE ADC result. -// * -// * @retval Result converted to millivolts. -// */ -//#define CUSTOM_VOUT_IN_MILLI_VOLTS(ADC_VALUE)\ -// (((((ADC_VALUE) * CUSTOM_REF_VOLTAGE_IN_MILLIVOLTS) / CUSTOM_ADC_RES_10BITS) * CUSTOM_PRE_SCALING_COMPENSATION)*2) - - -static const uint8_t imm_samples_in_buffer = 8; - -//uint32_t s_cnt; -uint8_t LED_list_imm[4]; -//uint8_t PD_list_custom[4]; - -//uint8_t led_custom_list_a[5] = {2,3,4,5,6}; -//uint8_t pd_custom_list_a[4] = {5,7,8,10}; - -//uint8_t led_custom_list_b[5] = {20,21,22,23,24}; -//uint8_t pd_custom_list_b[4] = {16,14,13,11}; - -int32_t c_max; -extern volatile bool processing; -extern volatile bool data_tx_in_progress; -extern volatile bool ble_connection_st; - -extern uint16_t m_pd_delay_us; -uint32_t c_cnt; -static int8_t pd_no = -1; -static int8_t led_no = -1; -static int8_t buf_no = 0; - -uint16_t sel_led_index0 =0; -uint16_t sel_led_index1 =1; -uint16_t sel_led_index2 =2; -uint16_t sel_led_index3 =3; - -//static int8_t c_max = 5; -static int32_t t_ms = 0; -int16_t imm_cycle_buff[4][imm_CYCLE_CNT] = - { - {0, 0, 0, 0, 0, 0, 0, 0}, //0 - {0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0} //3 - }; -int16_t imm_cycle_send_buff[imm_LED_NO] = {0, 0, 0, 0}; -uint16_t bi_imm_cycle_send_buff[imm_LED_NO] = {0, 0, 0, 0}; - -#define SAMPLES_IN_BUFFER 4095+32 -static nrf_saadc_value_t pd_imm_adc_buf[2][SAMPLES_IN_BUFFER]; - -bool pd_adc_custom_a_start = false; -bool pd_adc_custom_b_start = false; -bool pd_adc_custom_c_start = false; -bool pd_adc_custom_d_start = false; -bool pd_adc_custom_end = false; -bool pd_adc_custom_start = false; -bool pd_adc_imm_start = false; -bool pd_adc_imm_running = false; -bool custom_testing = false; - -// -bool custom_add_data; -extern bool ble_got_new_data; -extern bool motion_raw_data_enabled; -extern char ble_tx_buffer[BLE_NUS_MAX_DATA_LEN]; -uint8_t imm_bin_buffer[BLE_NUS_MAX_DATA_LEN]; -//add imu -uint8_t order_imm=0; - - - - - -extern which_cmd_t cmd_type_t; - -APP_TIMER_DEF(m_custom_check_loop_timer_id); -//APP_TIMER_DEF(m_custom_send_loop_timer_id); -#if FEATURE_DELAY -#define CUSTOM_SEND_LOOP_INTERVAL 500 -#else -#define CUSTOM_SEND_LOOP_INTERVAL 100 -#endif -#define CUSTOM_CHECK_LOOP_INTERVAL 1 - - - - -static nrf_ppi_channel_t m_ppi_channel; - - - -#if !FEATURE_PRINTF -void imm_ppi_init(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_init(); - APP_ERROR_CHECK(err_code); - - uint32_t gpiote_event_addr = nrf_drv_gpiote_in_event_addr_get(ADA2200_SYNCO_PIN); - uint32_t saadc_sample_task_addr = nrf_drv_saadc_sample_task_get(); - - /* setup ppi channel so that timer compare event is triggering sample task in SAADC */ - err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_ppi_channel_assign(m_ppi_channel, - gpiote_event_addr, - saadc_sample_task_addr); - APP_ERROR_CHECK(err_code); -} - - -void imm_ppi_uninit(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_uninit(); - APP_ERROR_CHECK(err_code); -} - - -void imm_sampling_event_enable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} - - -void imm_sampling_event_disable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_disable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} -#endif - - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void imm_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* PD Voltage reading */ -{ - ret_code_t err_code; - int16_t sum = 0; - - uint32_t custom_clk_delay = m_pd_delay_us/16; - if(ble_connection_st == 0) { - //imm_adc_end(); - //custom_send_timer_stop(); - DBG_PRINTF("Custom ADC STOP 1\r\n"); - } - - else{ - if (p_event->type == NRF_DRV_SAADC_EVT_DONE) - { - err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, imm_samples_in_buffer + custom_clk_delay); - APP_ERROR_CHECK(err_code); - - if(led_no == -1) { - led_no = 0; - pd_no = 0; - - led_on(LED_list_imm[led_no]); - led_pd_matching_value_set(LED_list_imm[led_no]); /* MCP4725 DAC setting and PD on */ - - } else { - - for(uint16_t i = custom_clk_delay; i < custom_clk_delay + imm_samples_in_buffer; i++){ - imm_cycle_buff[buf_no][i-custom_clk_delay] = p_event->data.done.p_buffer[i]; - } -#if FEATURE_PRINTF - DBG_PRINTF("-----------------Read ADC // led_no = %d(%d), pd_no = %d(%d), buf_no = %d\r\n\r\n", led_no, LED_list_custom[led_no], pd_no, PD_list_custom[pd_no], buf_no); -#endif - - buf_no++; - - if(pd_no >= - 1) { - //pd_no = 0; - - - - if(led_no < imm_LED_NO - 1) { - led_no++; - led_on(LED_list_imm[led_no]); - led_pd_matching_value_set(LED_list_imm[led_no]); /* MCP4725 DAC setting and PD on */ - - } else if(led_no >= imm_LED_NO - 1) { - pd_no = -1; - led_no = -1; -#if FEATURE_PRINTF - DBG_PRINTF("\r\nEnded\r\n"); -#endif - //imm_adc_end(); - //imm_adc_end_final(); - - /////////////////////////////////////////////////////////////////////////////////////////// - uint8_t k =0; - sum = 0; - for(uint16_t i = 0; i < 4; i++){ - for(uint16_t j = 0; j < imm_samples_in_buffer; j++){ - sum += imm_cycle_buff[i][j]; - } - - imm_cycle_send_buff[k++] = sum; - sum = 0; - } - - - - buf_no = 0; - - if(ble_connection_st == 0) { - - DBG_PRINTF("Custom ADC STOP 1"); - pd_adc_imm_start=false; - pd_adc_imm_running=false; - DBG_PRINTF ("FINISH SEND\r\n"); - processing = false; - custom_testing = false; - imm_adc_end_final(); - } - else { - char resp[4]; - - if(cmd_type_t == CMD_UART) { - //custom_send_timer_stop(); - DBG_PRINTF("value 4: %d,%d,%d,%d \r\n",imm_cycle_send_buff[0] ,imm_cycle_send_buff[1] ,imm_cycle_send_buff[2] ,imm_cycle_send_buff[3] ); - }else if(cmd_type_t == CMD_BLE) { - DBG_PRINTF("%d ms \r\n",t_ms); - DBG_PRINTF("value 4: %d,%d,%d,%d \r\n",imm_cycle_send_buff[0] ,imm_cycle_send_buff[1] ,imm_cycle_send_buff[2] ,imm_cycle_send_buff[3] ); - for(uint16_t i = 0; i < 4; i++){ - bi_imm_cycle_send_buff[i]=(uint16_t)(imm_cycle_send_buff[i]); - } - sprintf(resp,"rF%01X:", order_imm); - format_data(imm_bin_buffer, resp, bi_imm_cycle_send_buff, 4); - - - binary_tx_handler(imm_bin_buffer,6); - } - -// if(ble_connection_st == 1) { -// battery_timer_start(); -// } - -// led_off(99); -// pd_off(99); - imm_adc_start_init(); - } - } - } - } - } - } -} - -void imm_check_loop(void * p_context) -{ - UNUSED_PARAMETER(p_context); - imm_check_timer_stop(); - if ( custom_testing == false) - { - DBG_PRINTF("%d ms \r\n",t_ms); - // sprintf(custom_tx_buffer, "Measure Time :%d ms \r\n",t_ms); - } - else - { - t_ms++; - imm_check_timer_start(); - } -} - - - - -void imm_adc_start_init(void) -{ - if (ble_got_new_data ==true) - { - pd_adc_imm_start=false; - pd_adc_imm_running=false; - DBG_PRINTF ("FINISH SEND\r\n"); - led_off(99); - pd_off(99); - processing = false; - custom_testing = false; - imm_adc_end_final(); - } - - else if (pd_adc_imm_running==true){ - imm_adc_start(); - } - - else if (pd_adc_imm_start==true) - { -// custom_testing = false; -// motion_raw_data_enabled = true; -// custom_add_data = true; -// icm42670_main(); - //for(uint8_t i =0; i < imm_LED_NO; i++) { - LED_list_imm[0] = sel_led_index0; - LED_list_imm[1] = sel_led_index1; - LED_list_imm[2] = sel_led_index2; - LED_list_imm[3] = sel_led_index3; -// data_tx_handler(ble_tx_buffer); - - t_ms=0; - pd_adc_imm_start=false; - pd_adc_imm_running=true; - custom_testing = true; -// custom_check_timer_start(); - c_cnt=0; -// pd_adc_custom_start=false; -// pd_adc_custom_a_start=true; - - imm_adc_start2(); - imm_check_timer_start(); - c_cnt++; - } - - - - - else - { - - } -} - - - -void imm_adc_start(void) -{ - pd_no = -1; - led_no = -1; - buf_no = 0; - t_ms=0; - - - for(uint16_t i = 0; i < 4; i++) { - for(uint16_t j = 0; j < imm_CYCLE_CNT; j++) { - imm_cycle_buff[i][j] = 0; - } - } -if(order_imm>=15){ - order_imm=0; -} -else -{ order_imm++; -} -} - - -void imm_adc_start2(void) -{ - imm_adc_start(); - imm_adc_init(); - imm_irq_init(); - imm_ppi_init(); - imm_sampling_event_enable(); - -} - - -void imm_adc_end(void) -{ - - DBG_PRINTF("adc_end\r\n"); - - imm_sampling_event_disable(); - -} - -void imm_adc_end_final(void) -{ - - DBG_PRINTF("adc_end_for_good\r\n"); - - imm_sampling_event_disable(); - imm_irq_uninit(); - imm_ppi_uninit(); - imm_adc_uninit(); - battery_timer_start(); - -} - - - - - - -void imm_adc_init(void) -{ -#if FEATURE_PRINTF - DBG_PRINTF("custom_adc_init\r\n"); -#endif - - static nrfx_saadc_config_t default_config; - default_config.resolution = (nrf_saadc_resolution_t)NRFX_SAADC_CONFIG_RESOLUTION; /* Resolution is 10bits */ - default_config.oversample = (nrf_saadc_oversample_t)NRFX_SAADC_CONFIG_OVERSAMPLE; /* Over Sampling Disabled */ - default_config.interrupt_priority = NRFX_SAADC_CONFIG_IRQ_PRIORITY; /* Interrupt Priority is 0(Highest) */ - default_config.low_power_mode = NRFX_SAADC_CONFIG_LP_MODE; /* Low Power Mode is Disabled */ - - static nrf_saadc_channel_config_t config; - config.resistor_p = NRF_SAADC_RESISTOR_DISABLED; - config.resistor_n = NRF_SAADC_RESISTOR_DISABLED; - config.gain = NRF_SAADC_GAIN1_6; - config.reference = NRF_SAADC_REFERENCE_INTERNAL; - config.acq_time = NRF_SAADC_ACQTIME_3US; - config.mode = NRF_SAADC_MODE_DIFFERENTIAL; - config.burst = NRF_SAADC_BURST_DISABLED; - config.pin_p = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN0); - config.pin_n = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN1); - - ret_code_t err_code = nrf_drv_saadc_init(&default_config, imm_voltage_handler); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_channel_init(0, &config); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_buffer_convert(pd_imm_adc_buf[0], imm_samples_in_buffer + m_pd_delay_us/16); - APP_ERROR_CHECK(err_code); -} - - - -void imm_adc_uninit(void) -{ -#if FEATURE_PRINTF - DBG_PRINTF("pd_custom_adc_uninit\r\n"); -#endif - - nrf_drv_saadc_uninit(); - nrf_drv_saadc_channel_uninit(0); -} - - -#if !FEATURE_PRINTF -void imm_irq_init(void) -{ - ret_code_t err_code; - - /* Initialize int pin */ - if (!nrfx_gpiote_is_init()) - { - err_code = nrfx_gpiote_init(); - APP_ERROR_CHECK(err_code); - } - - nrfx_gpiote_in_config_t in_config = NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(true); - in_config.pull = NRF_GPIO_PIN_PULLDOWN; - - err_code = nrfx_gpiote_in_init(ADA2200_SYNCO_PIN, &in_config, NULL); - APP_ERROR_CHECK(err_code); - - nrfx_gpiote_in_event_enable(ADA2200_SYNCO_PIN, true); -} - - -void imm_irq_uninit(void) -{ - nrfx_gpiote_in_event_disable(ADA2200_SYNCO_PIN); - nrfx_gpiote_in_uninit(ADA2200_SYNCO_PIN); -} -#endif - - - - - -void imm_check_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_custom_check_loop_timer_id, APP_TIMER_TICKS(CUSTOM_CHECK_LOOP_INTERVAL), NULL)); -} - -void imm_check_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_custom_check_loop_timer_id)); - -} -void imm_check_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_custom_check_loop_timer_id, APP_TIMER_MODE_SINGLE_SHOT, imm_check_loop)); -} diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_imm.h b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_imm.h deleted file mode 100644 index a2dbddb..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_imm.h +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************************* - * @file meas_pd_imm.h - - ******************************************************************************/ - -#ifndef _MEAS_PD_IMM_H__ -#define _MEAS_PD_IMM_H__ - -#include "sdk_common.h" -#include "nrf_drv_saadc.h" - -#define ADA2200_SYNCO_PIN NRF_GPIO_PIN_MAP(0,17) - - -#define imm_PD_NO 1/////4 -#define imm_LED_NO 4////5 -#define imm_CYCLE_CNT 8 ////32 - - -void imm_ppi_init(void); -void imm_ppi_uninit(void); -void imm_sampling_event_enable(void); -void imm_sampling_event_disable(void); - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void imm_voltage_handler(nrf_drv_saadc_evt_t const * p_event); /* PD Voltage reading */ -void imm_adc_start_init(void); -void imm_adc_start(void); -void imm_adc_start2(void); -//void custom_adc_start2(void); -//void custom_adc_total_start(void); -void imm_adc_end(void); -void imm_adc_end_final(void); -void imm_adc_init(void); -void imm_adc_uninit(void); - -void imm_irq_init(void); -void imm_irq_uninit(void); - -//void custom_send_start(void); - -//void custom_send_loop(void * p_context); /* For x ms */ -//void custom_send_timer_start(void); -//void custom_send_timer_stop(void);; -//void custom_send_timer_init(void); - - -void imm_check_loop(void * p_context); -void imm_check_timer_start(void); -void imm_check_timer_stop(void);; -void imm_check_timer_init(void); - -#endif /* _MEAS_PD_VOLTAGE_CUSTOM_H__ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_custom.c b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_custom.c deleted file mode 100644 index 3da0380..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_custom.c +++ /dev/null @@ -1,885 +0,0 @@ -/******************************************************************************* - TEST medi50 Dec 23 - ******************************************************************************/ -#include "sdk_common.h" - -#include -#include -#include -#include -#include "nrf.h" -#include "boards.h" -#include "app_error.h" -#include "nrf_drv_saadc.h" -#include "nrfx_gpiote.h" -#include "app_timer.h" -#include "nrf_drv_timer.h" -#include "nrf_delay.h" -#include "nrf_drv_ppi.h" -#include "ada2200_spi.h" -#include "ble_nus.h" -#include "fstorage.h" -#include "measurements.h" -#include "meas_pd_voltage_custom.h" -#include "mcp4725_i2c.h" -#include "ad5272_i2c.h" -#include "main_timer.h" -#include "battery_saadc.h" -#include "main.h" -#include "app_raw_main.h" - -#define CUSTOM_REF_VOLTAGE_IN_MILLIVOLTS 600.0f /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ -#define CUSTOM_PRE_SCALING_COMPENSATION 6.0f /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/ -#define CUSTOM_ADC_RES_10BITS 1024.0f /**< Maximum digital value for 10-bit ADC conversion. */ -#define st_c_max 20 -/**@brief Macro to convert the result of ADC conversion in millivolts. - * - * @param[in] ADC_VALUE ADC result. - * - * @retval Result converted to millivolts. - */ -#define CUSTOM_VOUT_IN_MILLI_VOLTS(ADC_VALUE)\ - (((((ADC_VALUE) * CUSTOM_REF_VOLTAGE_IN_MILLIVOLTS) / CUSTOM_ADC_RES_10BITS) * CUSTOM_PRE_SCALING_COMPENSATION)*2) - - -uint8_t custom_samples_in_buffer = 8; - -uint32_t s_cnt; -uint8_t LED_list_custom[5]; -uint8_t PD_list_custom[4]; - -uint8_t led_custom_list_a[5] = {2,3,4,5,6}; -uint8_t pd_custom_list_a[4] = {5,7,8,10}; - -uint8_t led_custom_list_b[5] = {20,21,22,23,24}; -uint8_t pd_custom_list_b[4] = {16,14,13,11}; - -int32_t c_max; -extern volatile bool processing; -extern volatile bool data_tx_in_progress; -extern volatile bool ble_connection_st; - - -uint32_t c_cnt; -static int8_t pd_no = -1; -static int8_t led_no = -1; -static int8_t buf_no = 0; -//static int8_t c_max = 5; -static int32_t t_ms = 0; -double custom_cycle_buff[36][CUSTOM_CYCLE_CNT] = - { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //0 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //10 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //11 - - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //12 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //13 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //14 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //15 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //16 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //17 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //18 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //19 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //20 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //21 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //22 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //23 - - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //24 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //25 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //26 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //27 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //28 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //29 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //30 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //31 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //32 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //33 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //34 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //35 - }; -double custom_cycle_send_buff[CUSTOM_LED_NO][CUSTOM_PD_NO] = - { - {0, 0, 0, 0}, - {0, 0, 0, 0}, - {0, 0, 0, 0}, - {0, 0, 0, 0}, - {0, 0, 0, 0} - }; - - -#define SAMPLES_IN_BUFFER 4095+32 -static nrf_saadc_value_t pd_custom_adc_buf[2][SAMPLES_IN_BUFFER]; - -bool pd_adc_custom_a_start = false; -bool pd_adc_custom_b_start = false; -bool pd_adc_custom_c_start = false; -bool pd_adc_custom_d_start = false; -bool pd_adc_custom_end = false; -bool pd_adc_custom_start = false; - -bool custom_testing = false; - -// -bool custom_add_data; -extern bool motion_raw_data_enabled; -extern char ble_tx_buffer[BLE_NUS_MAX_DATA_LEN]; -//add imu - - - -char custom_tx_buffer[BLE_NUS_MAX_DATA_LEN]; - - - -char custom_tx_d_buffer_0[st_c_max][BLE_NUS_MAX_DATA_LEN]; -char custom_tx_d_buffer_1[st_c_max][BLE_NUS_MAX_DATA_LEN]; -char custom_tx_d_buffer_2[st_c_max][BLE_NUS_MAX_DATA_LEN]; -char custom_tx_d_buffer_3[st_c_max][BLE_NUS_MAX_DATA_LEN]; -char custom_tx_d_buffer_4[st_c_max][BLE_NUS_MAX_DATA_LEN]; - -char custom_tx_d_buffer_5[st_c_max][BLE_NUS_MAX_DATA_LEN]; -char custom_tx_d_buffer_6[st_c_max][BLE_NUS_MAX_DATA_LEN]; -char custom_tx_d_buffer_7[st_c_max][BLE_NUS_MAX_DATA_LEN]; -char custom_tx_d_buffer_8[st_c_max][BLE_NUS_MAX_DATA_LEN]; -char custom_tx_d_buffer_9[st_c_max][BLE_NUS_MAX_DATA_LEN]; - - - -extern which_cmd_t cmd_type_t; - -APP_TIMER_DEF(m_custom_check_loop_timer_id); -APP_TIMER_DEF(m_custom_send_loop_timer_id); -#if FEATURE_DELAY -#define CUSTOM_SEND_LOOP_INTERVAL 500 -#else -#define CUSTOM_SEND_LOOP_INTERVAL 100 -#endif -#define CUSTOM_CHECK_LOOP_INTERVAL 1 - - - -#if FEATURE_DEBUG_REPEAT_TEST -extern uint32_t rpt_cnt; -#endif - -#if FEATURE_PRINTF -APP_TIMER_DEF(m_custom_loop_timer_id); -#define CUSTOM_LOOP_INTERVAL 1 - -void custom_timer_loop(void * p_context) -{ - UNUSED_PARAMETER(p_context); - - ret_code_t err_code = nrf_drv_saadc_sample(); - APP_ERROR_CHECK(err_code); -} - -void custom_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_custom_loop_timer_id, APP_TIMER_TICKS(CUSTOM_LOOP_INTERVAL), NULL)); -} - -void custom_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_custom_loop_timer_id)); -} - -void custom_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_custom_loop_timer_id, APP_TIMER_MODE_REPEATED, custom_timer_loop)); -} -#else -static nrf_ppi_channel_t m_ppi_channel; -#endif - - -#if !FEATURE_PRINTF -void custom_ppi_init(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_init(); - APP_ERROR_CHECK(err_code); - - uint32_t gpiote_event_addr = nrf_drv_gpiote_in_event_addr_get(ADA2200_SYNCO_PIN); - uint32_t saadc_sample_task_addr = nrf_drv_saadc_sample_task_get(); - - /* setup ppi channel so that timer compare event is triggering sample task in SAADC */ - err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_ppi_channel_assign(m_ppi_channel, - gpiote_event_addr, - saadc_sample_task_addr); - APP_ERROR_CHECK(err_code); -} - - -void custom_ppi_uninit(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_uninit(); - APP_ERROR_CHECK(err_code); -} - - -void custom_sampling_event_enable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} - - -void custom_sampling_event_disable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_disable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} -#endif - - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void custom_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* PD Voltage reading */ -{ - ret_code_t err_code; - double sum = 0.0f; - - uint32_t custom_clk_delay = m_config.pd_delay_us/16; - if(ble_connection_st == 0) { - custom_adc_end(); - custom_send_timer_stop(); - printf("Custom ADC STOP 1\r\n"); - } - - else{ - if (p_event->type == NRF_DRV_SAADC_EVT_DONE) - { - err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, custom_samples_in_buffer + custom_clk_delay); - APP_ERROR_CHECK(err_code); - - if(led_no == -1) { - led_no = 0; - pd_no = 0; - - led_on(LED_list_custom[led_no]); - led_pd_matching_value_set(LED_list_custom[led_no]); /* MCP4725 DAC setting and PD on */ - - } else { - - for(uint16_t i = custom_clk_delay; i < custom_clk_delay + custom_samples_in_buffer; i++){ - custom_cycle_buff[buf_no][i-custom_clk_delay] = (CUSTOM_VOUT_IN_MILLI_VOLTS(p_event->data.done.p_buffer[i])) * -1; - } -#if FEATURE_PRINTF - printf("-----------------Read ADC // led_no = %d(%d), pd_no = %d(%d), buf_no = %d\r\n\r\n", led_no, LED_list_custom[led_no], pd_no, PD_list_custom[pd_no], buf_no); -#endif - - buf_no++; - - if(pd_no < CUSTOM_PD_NO - 1) { - pd_no++; - led_pd_matching_value_set(LED_list_custom[led_no]); /* MCP4725 DAC setting and PD on */ - - }else if(pd_no >= CUSTOM_PD_NO - 1) { - pd_no = 0; - -#if FEATURE_PRINTF - printf("\r\n\r\n"); -#endif - - if(led_no < CUSTOM_LED_NO - 1) { - led_no++; - led_on(LED_list_custom[led_no]); - led_pd_matching_value_set(LED_list_custom[led_no]); /* MCP4725 DAC setting and PD on */ - - } else if(led_no >= CUSTOM_LED_NO - 1) { - pd_no = -1; - led_no = -1; -#if FEATURE_PRINTF - printf("\r\nEnded\r\n"); -#endif - custom_adc_end(); - -#if FEATURE_DETAIL_VALUE_CUSTOM - sum = 0; - printf("\r\nCustom_============custom_cycle_buff =\r\n"); - for(uint16_t i = 0; i < 36; i++){ - for(uint16_t j = 0; j < custom_samples_in_buffer; j++){ - printf("%lf\r\n", custom_cycle_buff[i][j]); - } - for(uint16_t k = 0; k < custom_samples_in_buffer; k++){ - sum += custom_cycle_buff[i][k]; - } - printf("\t%lf\r\n", sum); - sum = 0; - } - printf("\r\n"); -#endif - - /////////////////////////////////////////////////////////////////////////////////////////// - uint8_t k =0; - sum = 0; - for(uint16_t i = 0; i < 20; i++){ - for(uint16_t j = 0; j < custom_samples_in_buffer; j++){ - sum += custom_cycle_buff[i][j]; - } - - custom_cycle_send_buff[i/4][k++] = sum; - sum = 0; - - if(k >= 4) k = 0; - } - /////////////////////////////////////////////////////////////////////////////////////////// - - /* Send data */ - /*********************/ - if(cmd_type_t == CMD_UART) { - printf("S%dTi%d,\t%lf,\t%lf,\t%lf,\t%lf,\r\n",c_cnt, LED_list_custom[0], custom_cycle_send_buff[0][0], custom_cycle_send_buff[0][1], custom_cycle_send_buff[0][2], custom_cycle_send_buff[0][3]);//, custom_cycle_send_buff[0][4], custom_cycle_send_buff[0][5]); - printf("Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\r\n", LED_list_custom[1], custom_cycle_send_buff[1][0], custom_cycle_send_buff[1][1], custom_cycle_send_buff[1][2], custom_cycle_send_buff[1][3]);//, custom_cycle_send_buff[1][4], custom_cycle_send_buff[1][5]); - printf("Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\r\n", LED_list_custom[2], custom_cycle_send_buff[2][0], custom_cycle_send_buff[2][1], custom_cycle_send_buff[2][2], custom_cycle_send_buff[2][3]);//, custom_cycle_send_buff[2][4], custom_cycle_send_buff[2][5]); - printf("Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\r\n", LED_list_custom[3], custom_cycle_send_buff[3][0], custom_cycle_send_buff[3][1], custom_cycle_send_buff[3][2], custom_cycle_send_buff[3][3]);//, custom_cycle_send_buff[3][4], custom_cycle_send_buff[3][5]); - printf("Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\r\n", LED_list_custom[4], custom_cycle_send_buff[4][0], custom_cycle_send_buff[4][1], custom_cycle_send_buff[4][2], custom_cycle_send_buff[4][3]);//, custom_cycle_send_buff[4][4], custom_cycle_send_buff[4][5]); - printf("\r\n"); - } else if(cmd_type_t == CMD_BLE ) { - if(pd_adc_custom_a_start == true ) { - sprintf(custom_tx_d_buffer_0[c_cnt], "M%d,Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\r\n",c_cnt, LED_list_custom[0], custom_cycle_send_buff[0][0], custom_cycle_send_buff[0][1], custom_cycle_send_buff[0][2], custom_cycle_send_buff[0][3]); - sprintf(custom_tx_d_buffer_1[c_cnt], "M%d,Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\r\n",c_cnt, LED_list_custom[1], custom_cycle_send_buff[1][0], custom_cycle_send_buff[1][1], custom_cycle_send_buff[1][2], custom_cycle_send_buff[1][3]); - sprintf(custom_tx_d_buffer_2[c_cnt], "M%d,Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\r\n",c_cnt, LED_list_custom[2], custom_cycle_send_buff[2][0], custom_cycle_send_buff[2][1], custom_cycle_send_buff[2][2], custom_cycle_send_buff[2][3]); - sprintf(custom_tx_d_buffer_3[c_cnt], "M%d,Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\r\n",c_cnt, LED_list_custom[3], custom_cycle_send_buff[3][0], custom_cycle_send_buff[3][1], custom_cycle_send_buff[3][2], custom_cycle_send_buff[3][3]); - sprintf(custom_tx_d_buffer_4[c_cnt], "M%d,Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\r\n",c_cnt, LED_list_custom[4], custom_cycle_send_buff[4][0], custom_cycle_send_buff[4][1], custom_cycle_send_buff[4][2], custom_cycle_send_buff[4][3]); - - }else if(pd_adc_custom_b_start == true) { - sprintf(custom_tx_d_buffer_5[c_cnt], "M%d,Ti%d,\t%lf,\t%lf,\t%lf,\t%lf\r\n",c_cnt, LED_list_custom[0], custom_cycle_send_buff[0][0], custom_cycle_send_buff[0][1], custom_cycle_send_buff[0][2], custom_cycle_send_buff[0][3]); - sprintf(custom_tx_d_buffer_6[c_cnt], "M%d,Ti%d,\t%lf,\t%lf,\t%lf,\t%lf\r\n",c_cnt, LED_list_custom[1], custom_cycle_send_buff[1][0], custom_cycle_send_buff[1][1], custom_cycle_send_buff[1][2], custom_cycle_send_buff[1][3]); - sprintf(custom_tx_d_buffer_7[c_cnt], "M%d,Ti%d,\t%lf,\t%lf,\t%lf,\t%lf\r\n",c_cnt, LED_list_custom[2], custom_cycle_send_buff[2][0], custom_cycle_send_buff[2][1], custom_cycle_send_buff[2][2], custom_cycle_send_buff[2][3]); - sprintf(custom_tx_d_buffer_8[c_cnt], "M%d,Ti%d,\t%lf,\t%lf,\t%lf,\t%lf\r\n",c_cnt, LED_list_custom[3], custom_cycle_send_buff[3][0], custom_cycle_send_buff[3][1], custom_cycle_send_buff[3][2], custom_cycle_send_buff[3][3]); - sprintf(custom_tx_d_buffer_9[c_cnt], "M%d,Ti%d,\t%lf,\t%lf,\t%lf,\t%lf\r\n",c_cnt, LED_list_custom[4], custom_cycle_send_buff[4][0], custom_cycle_send_buff[4][1], custom_cycle_send_buff[4][2], custom_cycle_send_buff[4][3]); - -} - } - /*********************/ - - buf_no = 0; - - if(ble_connection_st == 0) { - custom_adc_end(); - custom_send_timer_stop(); - printf("Custom ADC STOP 1"); - } - else if(pd_adc_custom_a_start == true) { // B mode - pd_adc_custom_a_start = false; - pd_adc_custom_b_start = true; - - custom_adc_start(); - - }else if(pd_adc_custom_b_start == true) { // Completed - pd_adc_custom_b_start = false; - - - -// } -// else if(pd_adc_custom_a_start == true) { // Completed -// pd_adc_custom_a_start = false; - - - if(cmd_type_t == CMD_UART) { - custom_send_timer_stop(); - - }else if(cmd_type_t == CMD_BLE) { - - - - } - -// if(ble_connection_st == 1) { -// battery_timer_start(); -// } - - led_off(99); - pd_off(99); - custom_adc_total_start(); - } - } - } - } - } - } -} - -void custom_check_loop(void * p_context) -{ - UNUSED_PARAMETER(p_context); - custom_check_timer_stop(); - if ( custom_testing == false) - { - printf("%d ms \r\n",t_ms); - sprintf(custom_tx_buffer, "Measure Time :%d ms \r\n",t_ms); - } - else - { - t_ms++; - custom_check_timer_start(); - } -} - - - - -void custom_send_loop(void * p_context) /* For x ms */ -{ - UNUSED_PARAMETER(p_context); - custom_send_timer_stop(); - if(ble_connection_st){ - if (data_tx_in_progress==true) { - // Data transmission is still in progress - printf("skip \r\n"); - return; - } - - static uint8_t order = 0; - - switch(order) { - case 0: - data_tx_handler(custom_tx_d_buffer_0[s_cnt]); - break; - - case 1: - data_tx_handler(custom_tx_d_buffer_1[s_cnt]); - break; - - case 2: - data_tx_handler(custom_tx_d_buffer_2[s_cnt]); - break; - - case 3: - data_tx_handler(custom_tx_d_buffer_3[s_cnt]); - break; - - case 4: - data_tx_handler(custom_tx_d_buffer_4[s_cnt]); - break; - - case 5: - data_tx_handler(custom_tx_d_buffer_5[s_cnt]); - break; - - case 6: - data_tx_handler(custom_tx_d_buffer_6[s_cnt]); - break; - - case 7: - data_tx_handler(custom_tx_d_buffer_7[s_cnt]); - break; - - case 8: - data_tx_handler(custom_tx_d_buffer_8[s_cnt]); - break; - - case 9: - data_tx_handler(custom_tx_d_buffer_9[s_cnt]); - - - order = 0; - custom_send_start(); -#if FEATURE_PRINTF - printf("custom_send Completed\r\n"); -#endif - - - return; - - default: - break; - } - - if(ble_connection_st == 0) { - custom_send_timer_stop(); - order = 0; - printf("Custom ADC STOP 2\r\n");} - else{ - - - - - order++; - custom_send_timer_start(); - - } -} - -} -void custom_send_start(void) -{ - s_cnt++; - if (s_cnt>c_max) - { - custom_send_timer_stop(); - - - data_tx_handler(ble_tx_buffer); - data_tx_handler(custom_tx_buffer); - battery_timer_start(); - } - else - { - custom_send_timer_start(); - } -} -void custom_adc_total_start(void) -{ - - if (pd_adc_custom_start==true) - { -// custom_testing = false; -// motion_raw_data_enabled = true; -// custom_add_data = true; -// icm42670_main(); -// -// data_tx_handler(ble_tx_buffer); - - t_ms=0; - custom_testing = true; - custom_check_timer_start(); - c_cnt=0; - pd_adc_custom_start=false; - pd_adc_custom_a_start=true; - custom_adc_start(); - c_cnt++; - - } - - else if (c_cnt -#include -#include -#include -#include "nrf.h" -#include "boards.h" -#include "app_error.h" -#include "nrf_drv_saadc.h" -#include "nrfx_gpiote.h" -#include "app_timer.h" -#include "nrf_drv_timer.h" -#include "nrf_delay.h" -#include "nrf_drv_ppi.h" -#include "ada2200_spi.h" -#include "ble_nus.h" -//#include "fstorage.h" -#include "measurements.h" -#include "meas_pd_voltage_full.h" -#include "mcp4725_i2c.h" -#include "ad5272_i2c.h" -#include "main_timer.h" -#include "battery_saadc.h" -#include "main.h" - - -#define FULL_REF_VOLTAGE_IN_MILLIVOLTS 600.0f /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ -#define FULL_PRE_SCALING_COMPENSATION 6.0f /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/ -#define FULL_ADC_RES_10BITS 1024.0f /**< Maximum digital value for 10-bit ADC conversion. */ - -/**@brief Macro to convert the result of ADC conversion in millivolts. - * - * @param[in] ADC_VALUE ADC result. - * - * @retval Result converted to millivolts. - */ -#define FULL_VOUT_IN_MILLI_VOLTS(ADC_VALUE)\ - (((((ADC_VALUE) * FULL_REF_VOLTAGE_IN_MILLIVOLTS) / FULL_ADC_RES_10BITS) * FULL_PRE_SCALING_COMPENSATION)*2) - - -//nrfjprog --family NRF52 --erasepag 0x27000-0xF7000 -static const uint8_t pd_full_type0[1] = {0}; -static const uint8_t pd_full_type1[1] = {1}; -//static const uint8_t pd_full_type2[1] = {2}; -//static const uint8_t led_full_list_type0[24] = {0,1,2,3,4,5,10,11,12,13,14,15,20,21,22,23,24,25,30,31,32,33,34,35}; -static const uint8_t led_full_list_type0[24] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23}; - -//static const uint8_t led_full_list_type1[24] = {40,41,42,43,44,45,50,51,52,53,54,55,60,61,62,63,64,65,70,71,72,73,74,75}; - -//static const uint8_t led_full_list_type3[24] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23}; -static const uint8_t led_full_list_type1[24] = {24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; - -//static const uint16_t delay_pd_led[3][50] = { {50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,500,500,500,500,500,500,500,500,500,50,50,50,50,500,500,50,50,50,50,50,50,50,50,500,50} -// ,{4000,4000,4000,4000,4000,4000,500,500,500,50,50,50,50,500,500,50,50,50,50,50,50,50,50,500,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50} -// ,{100,50,50,200,50,50,50,50,50,50,50,50,50,500,500,1000,500,50,50,50,500,50,500,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50} -// }; -bool full_testing = false; -bool full_testing_result = false; -static int32_t t_ms = 0; -uint8_t full_samples_in_buffer = 8; - -uint8_t add_cycle = 0; -uint8_t LED_list_full[24]; -uint8_t PD_list_full[1]; - -//uint8_t led_full_list_a[25] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}; -uint8_t led_full_list_a[24]; -uint8_t pd_full_list_a[1]; - -uint8_t led_full_list_b[24]; -uint8_t pd_full_list_b[1]; - - - - -//uint8_t led_full_list_c[25] = {25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49}; - -//uint8_t pd_full_list_c[1] = {2}; - -extern volatile uint8_t Sj_type; -extern volatile bool processing; -//static int8_t pd_no = -1; -static int8_t PD_list_full_nameA=0; -static int8_t PD_list_full_nameB=0; -static int8_t led_no = -1; -static int8_t buf_no = 0; -uint16_t buf_cnt = 0; -uint8_t full_bin_buffer[BLE_NUS_MAX_DATA_LEN]; -static uint8_t order = 0; -char full_tx_buffer[BLE_NUS_MAX_DATA_LEN]; -extern uint8_t ble_bin_buffer[BLE_NUS_MAX_DATA_LEN] ; -double full_cycle_buff[24][FULL_CYCLE_CNT] = - { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //0 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //10 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //11 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //12 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //13 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //14 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //15 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //16 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //17 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //18 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //19 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //20 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //21 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //22 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //23 - - }; - - - - int16_t bi_full_cycle_buff[24][FULL_CYCLE_CNT] = - { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //0 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //10 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //11 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //12 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //13 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //14 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //15 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //16 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //17 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //18 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //19 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //20 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //21 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //22 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //23 - - }; - -double full_cycle_send_buff[FULL_LED_NO] = - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; -int16_t bi_full_cycle_send_buff[FULL_LED_NO] = - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - - -uint16_t bi_full_cycle_send_buff_total[48] = - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - }; - -#define SAMPLES_IN_BUFFER 4095+32 -static nrf_saadc_value_t pd_full_adc_buf[2][SAMPLES_IN_BUFFER]; - -bool pd_adc_full_a_start = false; -bool pd_adc_full_b_start = false; -bool pd_adc_full_c_start = false; -bool pd_adc_full_d_start = false; -bool pd_adc_full_end = false; - - -char full_tx_buffer_0[BLE_NUS_MAX_DATA_LEN]; -char full_tx_buffer_1[BLE_NUS_MAX_DATA_LEN]; -char full_tx_buffer_2[BLE_NUS_MAX_DATA_LEN]; -char full_tx_buffer_3[BLE_NUS_MAX_DATA_LEN]; -char full_tx_buffer_4[BLE_NUS_MAX_DATA_LEN]; -char full_tx_buffer_5[BLE_NUS_MAX_DATA_LEN]; -extern which_cmd_t cmd_type_t; -extern uint16_t m_pd_delay_us; - -APP_TIMER_DEF(m_full_send_loop_timer_id); -#if FEATURE_DELAY -#define FULL_SEND_LOOP_INTERVAL 500 /* BLE Send Timer, Full_Mode Processing은 PPI로!!! */ -#else -#define FULL_SEND_LOOP_INTERVAL 100 -#endif -extern volatile bool ble_connection_st; - - - -APP_TIMER_DEF(m_full_check_loop_timer_id); - -#define FULL_CHECK_LOOP_INTERVAL 1 - - - - - -#if FEATURE_PRINTF -APP_TIMER_DEF(m_full_loop_timer_id); -#define FULL_LOOP_INTERVAL 1 - -void full_timer_loop(void * p_context) -{ - UNUSED_PARAMETER(p_context); - - ret_code_t err_code = nrf_drv_saadc_sample(); - APP_ERROR_CHECK(err_code); -} - -void full_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_full_loop_timer_id, APP_TIMER_TICKS(FULL_LOOP_INTERVAL), NULL)); -} - -void full_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_full_loop_timer_id)); -} - -void full_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_full_loop_timer_id, APP_TIMER_MODE_REPEATED, full_timer_loop)); -} -#else -static nrf_ppi_channel_t m_ppi_channel; -#endif - - - - - - -#if !FEATURE_PRINTF -void full_ppi_init(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_init(); - APP_ERROR_CHECK(err_code); - - uint32_t gpiote_event_addr = nrf_drv_gpiote_in_event_addr_get(ADA2200_SYNCO_PIN); - uint32_t saadc_sample_task_addr = nrf_drv_saadc_sample_task_get(); - - /* setup ppi channel so that timer compare event is triggering sample task in SAADC */ - err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_ppi_channel_assign(m_ppi_channel, - gpiote_event_addr, - saadc_sample_task_addr); - APP_ERROR_CHECK(err_code); -} -void full_check_loop(void * p_context) -{ - UNUSED_PARAMETER(p_context); - full_check_timer_stop(); - if ( full_testing == false) - { -// printf("%d ms \r\n",t_ms); -// sprintf(full_tx_buffer, "Measure Time :%d ms \r\n",t_ms); -// data_tx_handler(full_tx_buffer); - } - else - { - t_ms++; - full_check_timer_start(); - - } -} - - -void full_ppi_uninit(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_uninit(); - APP_ERROR_CHECK(err_code); -} - - -void full_sampling_event_enable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} - - -void full_sampling_event_disable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_disable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} -#endif - - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void full_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* PD Voltage reading */ -{ - ret_code_t err_code; - double sum = 0.0f; - int16_t bi_sum = 0; - uint32_t full_clk_delay; - - - - //full_clk_delay = delay_pd_led[PD_list_full[pd_no]][LED_list_full[led_no]]; - //printf("index %d,%d, %d \r\n",PD_list_full[pd_no],LED_list_full[led_no],led_no); - - full_clk_delay = m_pd_delay_us/16; - - - // printf("m: %d \r\n",full_clk_delay); - - - if (p_event->type == NRF_DRV_SAADC_EVT_DONE) - { - - - err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, full_samples_in_buffer + full_clk_delay); -// err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, full_samples_in_buffer ); - APP_ERROR_CHECK(err_code); - //buf_cnt++; - - if(led_no == -1) { - - //pd_no = 0; - - // printf("WHY %d\r\n",led_no); - led_no = 0; - led_on(LED_list_full[led_no]); - led_pd_matching_value_set(LED_list_full[led_no]); /* MCP4725 DAC setting and PD on */ - nrf_delay_ms(5); - } else { - - - for(uint16_t i = full_clk_delay; i < full_clk_delay + full_samples_in_buffer; i++){ - bi_full_cycle_buff[buf_no][i-full_clk_delay] =(p_event->data.done.p_buffer[i]) * 1; //-1 - full_cycle_buff[buf_no][i-full_clk_delay] = (FULL_VOUT_IN_MILLI_VOLTS(p_event->data.done.p_buffer[i])) * 1; //-1 - //printf("buff %d\r\n",sizeof(p_event->data.done.p_buffer)); - - //printf("BUFF ,%f,%f,%d,%d, %d %d\r\n", FULL_VOUT_IN_MILLI_VOLTS(p_event->data.done.p_buffer[i]),FULL_VOUT_IN_MILLI_VOLTS(p_event->data.done.p_buffer[full_clk_delay]),buf_no,i-full_clk_delay,i,full_clk_delay); - - if(i-full_clk_delay ==7) - { -// nrf_delay_us(1); - // printf("\r\n"); - if(buf_no==0) - { - // full_testing = false; - // printf("BUFF ,%f,%d,%d,%d, %d %d\r\n", FULL_VOUT_IN_MILLI_VOLTS(p_event->data.done.p_buffer[i]),p_event->data.done.p_buffer[i],buf_no,i-full_clk_delay,i,full_clk_delay); - - } - } - - } - - - buf_no++; - - //if(pd_no >= FULL_PD_NO -1) { - //pd_no = 0; - -#if FEATURE_PRINTF - printf("\r\n\r\n"); -#endif - - if(led_no < FULL_LED_NO-1 ) { - led_no++; - led_on(LED_list_full[led_no]); - led_pd_matching_value_set(LED_list_full[led_no]); /* MCP4725 DAC setting and PD on */ - - } else if(led_no >= FULL_LED_NO -1) { - //pd_no = -1; - led_no = -1; - printf("noled\r\n"); -#if FEATURE_PRINTF - printf("\r\nEnded\r\n"); -#endif - full_adc_end(); - - -// uint8_t k =0; - sum = 0; - for(uint16_t i = 0; i < 24; i++){ - for(uint16_t j = 0; j < full_samples_in_buffer; j++){ - sum += full_cycle_buff[i][j]; - } - full_cycle_send_buff[i] = sum; - sum = 0; - } - /////////////////////////////////////////////////////////////////////////////////////////// - bi_sum = 0; - for(uint16_t i = 0; i < 24; i++){ - for(uint16_t j = 0; j < full_samples_in_buffer; j++){ - bi_sum += bi_full_cycle_buff[i][j]; - } - bi_full_cycle_send_buff[i] = bi_sum; - bi_sum = 0; - } - - - - - - - - - - - - - - - - /* Send data */ - /*********************/ - - - - if(cmd_type_t == CMD_UART) { - printf("Tj%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", PD_list_full[0], full_cycle_send_buff[0],full_cycle_send_buff[1],full_cycle_send_buff[2],full_cycle_send_buff[3],full_cycle_send_buff[4],full_cycle_send_buff[5],full_cycle_send_buff[6],full_cycle_send_buff[7],full_cycle_send_buff[8],full_cycle_send_buff[9],full_cycle_send_buff[10], - full_cycle_send_buff[11],full_cycle_send_buff[12],full_cycle_send_buff[13],full_cycle_send_buff[14],full_cycle_send_buff[15],full_cycle_send_buff[16],full_cycle_send_buff[17],full_cycle_send_buff[18],full_cycle_send_buff[19],full_cycle_send_buff[20], - full_cycle_send_buff[21],full_cycle_send_buff[22],full_cycle_send_buff[23]); - printf("\r\n"); - } else if(cmd_type_t == CMD_BLE) { - if(pd_adc_full_a_start == true) { - - for(uint8_t i=0 ; i<24 ;i++) - { - bi_full_cycle_send_buff_total[i] = (uint16_t)bi_full_cycle_send_buff[i]; - } - - - sprintf(full_tx_buffer_0,"Tj%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", PD_list_full_nameA, full_cycle_send_buff[0],full_cycle_send_buff[1],full_cycle_send_buff[2],full_cycle_send_buff[3],full_cycle_send_buff[4],full_cycle_send_buff[5],full_cycle_send_buff[6],full_cycle_send_buff[7],full_cycle_send_buff[8],full_cycle_send_buff[9],full_cycle_send_buff[10], - full_cycle_send_buff[11]); - if(Sj_type==0){ - sprintf(full_tx_buffer_1,"%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%1f,\r\n", full_cycle_send_buff[12],full_cycle_send_buff[13],full_cycle_send_buff[14],full_cycle_send_buff[15],full_cycle_send_buff[16],full_cycle_send_buff[17],full_cycle_send_buff[18],full_cycle_send_buff[19],full_cycle_send_buff[20], - full_cycle_send_buff[21],full_cycle_send_buff[22],full_cycle_send_buff[23]); - } - else if(Sj_type==1){ - sprintf(full_tx_buffer_1,"%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%1fend\r\n", full_cycle_send_buff[12],full_cycle_send_buff[13],full_cycle_send_buff[14],full_cycle_send_buff[15],full_cycle_send_buff[16],full_cycle_send_buff[17],full_cycle_send_buff[18],full_cycle_send_buff[19],full_cycle_send_buff[20], - full_cycle_send_buff[21],full_cycle_send_buff[22],full_cycle_send_buff[23]); - } - } - else if(pd_adc_full_b_start == true){ - - for(uint8_t i=0 ; i<24 ;i++) - { - bi_full_cycle_send_buff_total[i+24] = (uint16_t)bi_full_cycle_send_buff[i]; - } - sprintf(full_tx_buffer_2,"Tj%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", PD_list_full_nameB, full_cycle_send_buff[0],full_cycle_send_buff[1],full_cycle_send_buff[2],full_cycle_send_buff[3],full_cycle_send_buff[4],full_cycle_send_buff[5],full_cycle_send_buff[6],full_cycle_send_buff[7],full_cycle_send_buff[8],full_cycle_send_buff[9],full_cycle_send_buff[10], - full_cycle_send_buff[11]); - - sprintf(full_tx_buffer_3,"%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%1fend\r\n", full_cycle_send_buff[12],full_cycle_send_buff[13],full_cycle_send_buff[14],full_cycle_send_buff[15],full_cycle_send_buff[16],full_cycle_send_buff[17],full_cycle_send_buff[18],full_cycle_send_buff[19],full_cycle_send_buff[20], - full_cycle_send_buff[21],full_cycle_send_buff[22],full_cycle_send_buff[23]); - -// }else if(pd_adc_full_c_start == true) { -// sprintf(full_tx_buffer_4,"Tj%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", PD_list_full[0], full_cycle_send_buff[0],full_cycle_send_buff[1],full_cycle_send_buff[2],full_cycle_send_buff[3],full_cycle_send_buff[4],full_cycle_send_buff[5],full_cycle_send_buff[6],full_cycle_send_buff[7],full_cycle_send_buff[8],full_cycle_send_buff[9],full_cycle_send_buff[10], -// full_cycle_send_buff[11]); -// sprintf(full_tx_buffer_5,"%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%1f,\t%1f\r\n", full_cycle_send_buff[12],full_cycle_send_buff[13],full_cycle_send_buff[14],full_cycle_send_buff[15],full_cycle_send_buff[16],full_cycle_send_buff[17],full_cycle_send_buff[18],full_cycle_send_buff[19],full_cycle_send_buff[20], -// full_cycle_send_buff[21],full_cycle_send_buff[22],full_cycle_send_buff[23],full_cycle_send_buff[24]); - } - /*********************/ - - buf_no =0; - - } - if(cmd_type_t == CMD_UART) { - full_send_timer_stop(); - - }else if(cmd_type_t == CMD_BLE) { - printf("Send\r\n"); - - printf("Tj%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", PD_list_full[0], full_cycle_send_buff[0],full_cycle_send_buff[1],full_cycle_send_buff[2],full_cycle_send_buff[3],full_cycle_send_buff[4],full_cycle_send_buff[5],full_cycle_send_buff[6],full_cycle_send_buff[7],full_cycle_send_buff[8],full_cycle_send_buff[9],full_cycle_send_buff[10], - full_cycle_send_buff[11],full_cycle_send_buff[12],full_cycle_send_buff[13],full_cycle_send_buff[14],full_cycle_send_buff[15],full_cycle_send_buff[16],full_cycle_send_buff[17],full_cycle_send_buff[18],full_cycle_send_buff[19],full_cycle_send_buff[20], - full_cycle_send_buff[21],full_cycle_send_buff[22],full_cycle_send_buff[23]); - printf("\r\n"); - - - - printf("Tj%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", - PD_list_full[0], - bi_full_cycle_send_buff[0], bi_full_cycle_send_buff[1], bi_full_cycle_send_buff[2], bi_full_cycle_send_buff[3], - bi_full_cycle_send_buff[4], bi_full_cycle_send_buff[5], bi_full_cycle_send_buff[6], bi_full_cycle_send_buff[7], - bi_full_cycle_send_buff[8], bi_full_cycle_send_buff[9], bi_full_cycle_send_buff[10], bi_full_cycle_send_buff[11], - bi_full_cycle_send_buff[12], bi_full_cycle_send_buff[13], bi_full_cycle_send_buff[14], bi_full_cycle_send_buff[15], - bi_full_cycle_send_buff[16], bi_full_cycle_send_buff[17], bi_full_cycle_send_buff[18], bi_full_cycle_send_buff[19], - bi_full_cycle_send_buff[20], bi_full_cycle_send_buff[21], bi_full_cycle_send_buff[22], bi_full_cycle_send_buff[23]); - - printf("\r\n"); - - - - - - - - //full_send_timer_start(); - } - if(pd_adc_full_a_start == true) { // A mode - pd_adc_full_a_start = false; - -// if(Sj_type == 0){ -// full_adc_start();} -// else{pd_adc_full_end = true;} - if(Sj_type==0){ - pd_adc_full_b_start = true; - full_adc_start(); - } - else - { pd_adc_full_b_start = false; - pd_adc_full_end = true;} - - }else if(pd_adc_full_b_start == true) { // B mode - pd_adc_full_b_start = false; - pd_adc_full_end = true; - - - if(ble_connection_st == 1) { - battery_timer_start(); - } - - led_off(99); - pd_off(99); - format_data(full_bin_buffer, "rsj:", bi_full_cycle_send_buff_total, 96); - - - binary_tx_handler(full_bin_buffer,50); - processing = false; - } - } - // } - } - } -} - - -void full_send_loop(void * p_context) /* For x ms */ -{ - UNUSED_PARAMETER(p_context); - full_send_timer_stop(); - - - - - switch(order) { - case 0: - data_tx_handler(full_tx_buffer_0); - break; - - case 1: - data_tx_handler(full_tx_buffer_1); - if(Sj_type == 1) - {order = 5; - // full_testing = false; - //return; - break;} - else{ - break; - } - case 2: - if(Sj_type == 0) - {data_tx_handler(full_tx_buffer_2);} - break; - - case 3: - if(Sj_type == 0) - {data_tx_handler(full_tx_buffer_3);} - order = 5; - break; -// sprintf(full_tx_buffer, "Measure Time :%d ms \r\n",t_ms); -// data_tx_handler(full_tx_buffer); -// - //full_testing = false; - // return;} - - case 4: - //data_tx_handler(full_tx_buffer_4); - break; - - case 5: - //data_tx_handler(full_tx_buffer_5); - // order = 0; - case 6: - printf("Measure Time : %d ms \r\n",t_ms); - //sprintf(full_tx_buffer, "Measure Time :%d ms \r\n",t_ms); - // data_tx_handler(full_tx_buffer); - order = 0; - return; -#if FEATURE_PRINTF - printf("full_send Completed\r\n"); -#endif - - - - default: - - break; - } - order++; - if(ble_connection_st == BLE_DISCONNECTED_ST) { - // order=0; - // full_send_timer_stop(); - // printf("Full ADC STOP 2\r\n"); - - } - else{ - full_send_timer_start(); - } -} -void full_adc_start_first(uint8_t type,uint8_t PD_PICK ,uint8_t LED_PICK) -{ - - - -switch(type){ - case 0: - pd_full_list_a[0] = pd_full_type0[0]; - pd_full_list_b[0] = pd_full_type1[0]; - PD_list_full_nameA = 0; - PD_list_full_nameB = 1; - Sj_type =0; - for (uint8_t i=0 ; i<24 ;i++) - { - led_full_list_a[i]= led_full_list_type0[i]; - led_full_list_b[i]= led_full_list_type1[i]; - - } - break; - - case 1: - pd_full_list_a[0] = pd_full_type0[0]; - pd_full_list_b[0] = pd_full_type0[0]; - Sj_type =1; - PD_list_full_nameA = 0; - PD_list_full_nameB = 0; - for (uint8_t i=0 ; i<24 ;i++) - { - led_full_list_a[i]= led_full_list_type1[i]; - led_full_list_b[i]= led_full_list_type1[i]; - } - break; - - case 2: - pd_full_list_a[0] = pd_full_type1[0]; - pd_full_list_b[0] = pd_full_type1[0]; - Sj_type =1; - PD_list_full_nameA = 1; - PD_list_full_nameB = 1; - for (uint8_t i=0 ; i<24 ;i++) - { - led_full_list_a[i]= led_full_list_type0[i]; - led_full_list_b[i]= led_full_list_type0[i]; - } - break; - - - - case 4: - pd_full_list_a[0] =PD_PICK; - pd_full_list_b[0] =PD_PICK; - Sj_type =0; - PD_list_full_nameA = PD_PICK*10; - PD_list_full_nameB = PD_PICK*10+1; - for (uint8_t i=0 ; i<24 ;i++) - { - led_full_list_a[i]= LED_PICK; - led_full_list_b[i]= LED_PICK; - } - break; - - default: - pd_full_list_a[0] = pd_full_type1[0]; - pd_full_list_b[0] = pd_full_type0[0]; - Sj_type =0; - PD_list_full_nameA = 1; - PD_list_full_nameB = 0; - for (uint8_t i=0 ; i<24 ;i++) - { - led_full_list_a[i]= led_full_list_type0[i]; - led_full_list_b[i]= led_full_list_type1[i]; - } - break; - - - } - - - -full_adc_start(); - -} -void full_adc_start() -{ - t_ms=0; - full_check_timer_start(); - full_testing =true; - - - //pd_no = 0; - led_no = -1; - buf_no = 0; - - - - - - if(pd_adc_full_a_start == true) { -#if FEATURE_PRINTF - printf("\r\n===== Full_A start ====================\r\n"); - printf("LED : "); -#endif - - for(uint8_t i =0; i < FULL_LED_NO; i++) { - LED_list_full[i] = led_full_list_a[i]; -#if FEATURE_PRINTF - printf("%d ", LED_list_full[i]); -#endif - } -#if FEATURE_PRINTF - printf("\r\n"); - printf("PD : "); -#endif - // for(uint8_t i =0; i < FULL_PD_NO; i++) { - PD_list_full[0] = pd_full_list_a[0]; -#if FEATURE_PRINTF - printf("%d ", PD_list_full[i]); -#endif - } -#if FEATURE_PRINTF - printf("\r\n\r\n"); -#endif -// } - - if(pd_adc_full_b_start == true) { -#if FEATURE_PRINTF - printf("\r\n===== Full_B start ====================\r\n"); - printf("LED : "); - -#endif - for(uint8_t i =0; i < FULL_LED_NO; i++) { - LED_list_full[i] = led_full_list_b[i]; -#if FEATURE_PRINTF - printf("%d ", LED_list_full[i]); -#endif - } - -#if FEATURE_PRINTF - printf("\r\n"); - printf("PD : "); -#endif - - // for(uint8_t i =0; i < FULL_PD_NO; i++) { - PD_list_full[0] = pd_full_list_b[0]; -#if FEATURE_PRINTF - printf("%d ", PD_list_full[i]); -#endif - } - - - - for(uint16_t i = 0; i < 24; i++) { - for(uint16_t j = 0; j < FULL_CYCLE_CNT; j++) { - full_cycle_buff[i][j] = 0.0f; - } - } - for(uint8_t i = 0; i < FULL_LED_NO; i++) { - - full_cycle_send_buff[i] = 0.0f; - - } - - - for(uint16_t i = 0; i < 24; i++) { - for(uint16_t j = 0; j < FULL_CYCLE_CNT; j++) { - bi_full_cycle_buff[i][j] = 0; - } - } - for(uint8_t i = 0; i < FULL_LED_NO; i++) { - - bi_full_cycle_send_buff[i] = 0; - - } - - full_adc_start2(); - order = 0; -} - - -void full_adc_start2(void) -{ - full_adc_init(); - -#if FEATURE_PRINTF - full_timer_start(); -#else - full_irq_init(); - full_ppi_init(); - full_sampling_event_enable(); -#endif - -} - - -void full_adc_end(void) -{ -#if FEATURE_PRINTF - printf("full_adc_end\r\n"); - full_timer_stop(); -#endif - -#if !FEATURE_PRINTF - full_sampling_event_disable(); - full_irq_uninit(); - full_ppi_uninit(); -#endif - full_adc_uninit(); - full_testing = false; - -} - - -void full_adc_init(void) -{ -#if FEATURE_PRINTF - printf("full_adc_init\r\n"); -#endif - - static nrfx_saadc_config_t default_config; - default_config.resolution = (nrf_saadc_resolution_t)NRFX_SAADC_CONFIG_RESOLUTION; /* Resolution is 10bits */ - default_config.oversample = (nrf_saadc_oversample_t)NRFX_SAADC_CONFIG_OVERSAMPLE; /* Over Sampling Disabled */ - default_config.interrupt_priority = NRFX_SAADC_CONFIG_IRQ_PRIORITY; /* Interrupt Priority is 0(Highest) */ - default_config.low_power_mode = NRFX_SAADC_CONFIG_LP_MODE; /* Low Power Mode is Disabled */ - - static nrf_saadc_channel_config_t config; - config.resistor_p = NRF_SAADC_RESISTOR_DISABLED; - config.resistor_n = NRF_SAADC_RESISTOR_DISABLED; - config.gain = NRF_SAADC_GAIN1_6; - config.reference = NRF_SAADC_REFERENCE_INTERNAL; - config.acq_time = NRF_SAADC_ACQTIME_3US; //3-->20 - config.mode = NRF_SAADC_MODE_DIFFERENTIAL; - config.burst = NRF_SAADC_BURST_DISABLED; - config.pin_p = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN0); - config.pin_n = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN1); - - ret_code_t err_code = nrf_drv_saadc_init(&default_config, full_voltage_handler); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_channel_init(0, &config); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_buffer_convert(pd_full_adc_buf[0], full_samples_in_buffer + m_pd_delay_us/16);//16 - APP_ERROR_CHECK(err_code); - //printf("init"); -} - - -void full_adc_uninit(void) -{ -#if FEATURE_PRINTF - printf("pd_full_adc_uninit\r\n"); -#endif - - nrf_drv_saadc_uninit(); - nrf_drv_saadc_channel_uninit(0); -} - - -#if !FEATURE_PRINTF -void full_irq_init(void) -{ - ret_code_t err_code; - - /* Initialize int pin */ - if (!nrfx_gpiote_is_init()) - { - err_code = nrfx_gpiote_init(); - APP_ERROR_CHECK(err_code); - } - - nrfx_gpiote_in_config_t in_config = NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(true); - in_config.pull = NRF_GPIO_PIN_PULLDOWN; - - err_code = nrfx_gpiote_in_init(ADA2200_SYNCO_PIN, &in_config, NULL); - APP_ERROR_CHECK(err_code); - - nrfx_gpiote_in_event_enable(ADA2200_SYNCO_PIN, true); -} - - -void full_irq_uninit(void) -{ - nrfx_gpiote_in_event_disable(ADA2200_SYNCO_PIN); - nrfx_gpiote_in_uninit(ADA2200_SYNCO_PIN); -} -#endif - - -void full_send_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_full_send_loop_timer_id, APP_TIMER_TICKS(FULL_SEND_LOOP_INTERVAL), NULL)); -} - - -void full_send_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_full_send_loop_timer_id)); - -} - - -void full_send_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_full_send_loop_timer_id, APP_TIMER_MODE_SINGLE_SHOT, full_send_loop)); -} - -void full_check_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_full_check_loop_timer_id, APP_TIMER_TICKS(FULL_CHECK_LOOP_INTERVAL), NULL)); -} - -void full_check_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_full_check_loop_timer_id)); - -} -void full_check_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_full_check_loop_timer_id, APP_TIMER_MODE_SINGLE_SHOT, full_check_loop)); -} diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_full.h b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_full.h deleted file mode 100644 index d691138..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_full.h +++ /dev/null @@ -1,64 +0,0 @@ -/******************************************************************************* - * @file meas_pd_voltage_full.h - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#ifndef _MEAS_PD_VOLTAGE_FULL_H__ -#define _MEAS_PD_VOLTAGE_FULL_H__ - -#include "sdk_common.h" -#include "nrf_drv_saadc.h" - -#define ADA2200_SYNCO_PIN NRF_GPIO_PIN_MAP(0,17) - - -#define FULL_PD_NO 1 -#define FULL_LED_NO 24 -#define FULL_CYCLE_CNT 32 /* Dummy=65535/16us(Max Delay), Cycle_Max_Cnt=32*/ - -#if FEATURE_PRINTF -void full_timer_loop(void * p_context); -void full_timer_start(void); -void full_timer_stop(void); -void full_timer_init(void); -#endif - -void full_ppi_init(void); -void full_ppi_uninit(void); -void full_sampling_event_enable(void); -void full_sampling_event_disable(void); - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void full_voltage_handler(nrf_drv_saadc_evt_t const * p_event); /* PD Voltage reading */ -void full_adc_start_first(uint8_t type,uint8_t PD_PICK ,uint8_t LED_PICK); -void full_adc_start(void); -void full_adc_start2(void); -void full_adc_end(void); -void full_adc_init(void); -void full_adc_uninit(void); -#if !FEATURE_PRINTF -void full_irq_init(void); -void full_irq_uninit(void); -#endif - -void ble_Tx_process(void); -void full_send_loop(void * p_context); /* For x ms */ -void full_send_timer_start(void); -void full_send_timer_stop(void);; -void full_send_timer_init(void); - - -void full_check_loop(void * p_context); -void full_check_timer_start(void); -void full_check_timer_stop(void);; -void full_check_timer_init(void); - -#endif /* _MEAS_PD_VOLTAGE_FULL_H__ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_half.c b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_half.c deleted file mode 100644 index 0dd0957..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_half.c +++ /dev/null @@ -1,836 +0,0 @@ -/******************************************************************************* - TEST medi50 Dec 23 - ******************************************************************************/ -#include "sdk_common.h" - -#include -#include -#include -#include -#include "nrf.h" -#include "boards.h" -#include "app_error.h" -#include "nrf_drv_saadc.h" -#include "nrfx_gpiote.h" -#include "app_timer.h" -#include "nrf_drv_timer.h" -#include "nrf_delay.h" -#include "nrf_drv_ppi.h" -#include "ada2200_spi.h" -#include "ble_nus.h" -#include "fstorage.h" -#include "measurements.h" -#include "meas_pd_voltage_half.h" -#include "mcp4725_i2c.h" -#include "ad5272_i2c.h" -#include "main_timer.h" -#include "battery_saadc.h" -#include "main.h" -#include "power_control.h" -#define HALF_REF_VOLTAGE_IN_MILLIVOLTS 600.0f /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ -#define HALF_PRE_SCALING_COMPENSATION 6.0f /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/ -#define HALF_ADC_RES_10BITS 1024.0f /**< Maximum digital value for 10-bit ADC conversion. */ - -/**@brief Macro to convert the result of ADC conversion in millivolts. - * - * @param[in] ADC_VALUE ADC result. - * - * @retval Result converted to millivolts. - */ -#define HALF_VOUT_IN_MILLI_VOLTS(ADC_VALUE)\ - (((((ADC_VALUE) * HALF_REF_VOLTAGE_IN_MILLIVOLTS) / HALF_ADC_RES_10BITS) * HALF_PRE_SCALING_COMPENSATION)*2) - - -uint8_t half_samples_in_buffer = 8; - - -uint8_t LED_list_half[6]; -uint8_t PD_list_half[6]; - -uint8_t led_half_list_a[6] = {1,2,3,4,5,6}; -uint8_t pd_half_list_a[6] = {5,6,7,8,9,10}; - -uint8_t led_half_list_b[6] = {7,8,9,10,11,12}; -uint8_t pd_half_list_b[6] = {6,5,4,3,2,1}; - -uint8_t led_half_list_c[6] = {13,14,15,16,17,18}; -uint8_t pd_half_list_c[6] = {15,16,17,18,19,20}; - -uint8_t led_half_list_d[6] = {19,20,21,22,23,24}; -uint8_t pd_half_list_d[6] = {16,15,14,13,12,11}; - -bool prestatus; -static int8_t pd_no = -1; -static int8_t led_no = -1; -static int8_t buf_no = 0; -static uint8_t order = 0; -double half_cycle_buff[36][HALF_CYCLE_CNT] = - { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //0 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //1 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //2 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //3 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //4 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //5 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //6 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //7 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //8 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //9 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //10 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //11 - - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //12 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //13 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //14 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //15 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //16 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //17 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //18 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //19 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //20 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //21 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //22 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //23 - - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //24 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //25 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //26 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //27 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //28 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //29 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //30 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //31 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //32 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //33 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //34 - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //35 - }; -double half_cycle_send_buff[HALF_LED_NO][HALF_PD_NO] = - { - {0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0} - }; - - -#define SAMPLES_IN_BUFFER 4095+32 -static nrf_saadc_value_t pd_half_adc_buf[2][SAMPLES_IN_BUFFER]; - -bool pd_adc_half_a_start = false; -bool pd_adc_half_b_start = false; -bool pd_adc_half_c_start = false; -bool pd_adc_half_d_start = false; -bool pd_adc_half_end = false; - - -char half_tx_buffer_0[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_1[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_2[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_3[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_4[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_5[BLE_NUS_MAX_DATA_LEN]; - -char half_tx_buffer_6[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_7[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_8[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_9[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_10[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_11[BLE_NUS_MAX_DATA_LEN]; - -char half_tx_buffer_12[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_13[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_14[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_15[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_16[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_17[BLE_NUS_MAX_DATA_LEN]; - -char half_tx_buffer_18[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_19[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_20[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_21[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_22[BLE_NUS_MAX_DATA_LEN]; -char half_tx_buffer_23[BLE_NUS_MAX_DATA_LEN]; - -extern which_cmd_t cmd_type_t; - - -APP_TIMER_DEF(m_half_send_loop_timer_id); -#if FEATURE_DELAY -#define HALF_SEND_LOOP_INTERVAL 500 -#else -#define HALF_SEND_LOOP_INTERVAL 100 -#endif - -extern volatile bool ble_connection_st; -#if FEATURE_DEBUG_REPEAT_TEST -extern uint32_t rpt_cnt; -#endif - -#if FEATURE_PRINTF -APP_TIMER_DEF(m_half_loop_timer_id); -#define HALF_LOOP_INTERVAL 1 - -void half_timer_loop(void * p_context) -{ - UNUSED_PARAMETER(p_context); - - ret_code_t err_code = nrf_drv_saadc_sample(); - APP_ERROR_CHECK(err_code); -} - -void half_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_half_loop_timer_id, APP_TIMER_TICKS(HALF_LOOP_INTERVAL), NULL)); -} - -void half_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_half_loop_timer_id)); -} - -void half_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_half_loop_timer_id, APP_TIMER_MODE_REPEATED, half_timer_loop)); -} -#else -static nrf_ppi_channel_t m_ppi_channel; -#endif - - -#if !FEATURE_PRINTF -void half_ppi_init(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_init(); - APP_ERROR_CHECK(err_code); - - uint32_t gpiote_event_addr = nrf_drv_gpiote_in_event_addr_get(ADA2200_SYNCO_PIN); - uint32_t saadc_sample_task_addr = nrf_drv_saadc_sample_task_get(); - - /* setup ppi channel so that timer compare event is triggering sample task in SAADC */ - err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_ppi_channel_assign(m_ppi_channel, - gpiote_event_addr, - saadc_sample_task_addr); - APP_ERROR_CHECK(err_code); -} - - -void half_ppi_uninit(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_uninit(); - APP_ERROR_CHECK(err_code); -} - - -void half_sampling_event_enable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} - - -void half_sampling_event_disable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_disable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} -#endif - - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void half_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* PD Voltage reading */ -{ - ret_code_t err_code; - double sum = 0.0f; - - uint32_t half_clk_delay = m_config.pd_delay_us/16; - if (prestatus==true) - { half_clk_delay =10;} - if(ble_connection_st == 0) { - half_adc_end(); - half_send_timer_stop(); - printf("Half ADC STOP 1\r\n"); - } - - else{ - if (p_event->type == NRF_DRV_SAADC_EVT_DONE) - { - err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, half_samples_in_buffer + half_clk_delay); - APP_ERROR_CHECK(err_code); - - if(led_no == -1) { - led_no = 0; - pd_no = 0; - - led_on(LED_list_half[led_no]); - led_pd_matching_value_set(LED_list_half[led_no], PD_list_half[pd_no]); /* MCP4725 DAC setting and PD on */ - - } else { -#if FEATURE_FOR_SCOPE - nrf_gpio_pin_set(ADC_CLK_18); - nrf_gpio_pin_clear(ADC_CLK_18); -#endif - for(uint16_t i = half_clk_delay; i < half_clk_delay + half_samples_in_buffer; i++){ - half_cycle_buff[buf_no][i-half_clk_delay] = (HALF_VOUT_IN_MILLI_VOLTS(p_event->data.done.p_buffer[i])) * -1; - } -#if FEATURE_PRINTF - printf("-----------------Read ADC // led_no = %d(%d), pd_no = %d(%d), buf_no = %d\r\n\r\n", led_no, LED_list_half[led_no], pd_no, PD_list_half[pd_no], buf_no); -#endif - - buf_no++; - - if(pd_no < HALF_PD_NO - 1) { - pd_no++; - led_pd_matching_value_set(LED_list_half[led_no], PD_list_half[pd_no]); /* MCP4725 DAC setting and PD on */ - - }else if(pd_no >= HALF_PD_NO - 1) { - pd_no = 0; - -#if FEATURE_PRINTF - printf("\r\n\r\n"); -#endif - - if(led_no < HALF_LED_NO - 1) { - led_no++; - led_on(LED_list_half[led_no]); - led_pd_matching_value_set(LED_list_half[led_no], PD_list_half[pd_no]); /* MCP4725 DAC setting and PD on */ - - } else if(led_no >= HALF_LED_NO - 1) { - pd_no = -1; - led_no = -1; -#if FEATURE_PRINTF - printf("\r\nEnded\r\n"); -#endif - half_adc_end(); - -#if FEATURE_DETAIL_VALUE_HALF - sum = 0; - printf("\r\nHalf_============half_cycle_buff =\r\n"); - for(uint16_t i = 0; i < 36; i++){ - for(uint16_t j = 0; j < half_samples_in_buffer; j++){ - printf("%lf\r\n", half_cycle_buff[i][j]); - } - for(uint16_t k = 0; k < half_samples_in_buffer; k++){ - sum += half_cycle_buff[i][k]; - } - printf("\t%lf\r\n", sum); - sum = 0; - } - printf("\r\n"); -#endif - - /////////////////////////////////////////////////////////////////////////////////////////// - uint8_t k =0; - sum = 0; - for(uint16_t i = 0; i < 36; i++){ - for(uint16_t j = 0; j < half_samples_in_buffer; j++){ - sum += half_cycle_buff[i][j]; - } - - half_cycle_send_buff[i/6][k++] = sum; - sum = 0; - - if(k >= 6) k = 0; - } - /////////////////////////////////////////////////////////////////////////////////////////// - - /* Send data */ - /*********************/ - if(cmd_type_t == CMD_UART && prestatus==false) { - printf("Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[0], half_cycle_send_buff[0][0], half_cycle_send_buff[0][1], half_cycle_send_buff[0][2], half_cycle_send_buff[0][3], half_cycle_send_buff[0][4], half_cycle_send_buff[0][5]); - printf("Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[1], half_cycle_send_buff[1][0], half_cycle_send_buff[1][1], half_cycle_send_buff[1][2], half_cycle_send_buff[1][3], half_cycle_send_buff[1][4], half_cycle_send_buff[1][5]); - printf("Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[2], half_cycle_send_buff[2][0], half_cycle_send_buff[2][1], half_cycle_send_buff[2][2], half_cycle_send_buff[2][3], half_cycle_send_buff[2][4], half_cycle_send_buff[2][5]); - printf("Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[3], half_cycle_send_buff[3][0], half_cycle_send_buff[3][1], half_cycle_send_buff[3][2], half_cycle_send_buff[3][3], half_cycle_send_buff[3][4], half_cycle_send_buff[3][5]); - printf("Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[4], half_cycle_send_buff[4][0], half_cycle_send_buff[4][1], half_cycle_send_buff[4][2], half_cycle_send_buff[4][3], half_cycle_send_buff[4][4], half_cycle_send_buff[4][5]); - printf("Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[5], half_cycle_send_buff[5][0], half_cycle_send_buff[5][1], half_cycle_send_buff[5][2], half_cycle_send_buff[5][3], half_cycle_send_buff[5][4], half_cycle_send_buff[5][5]); - printf("\r\n"); - } else if(cmd_type_t == CMD_BLE && prestatus==false) { - if(pd_adc_half_a_start == true) { - sprintf(half_tx_buffer_0, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[0], half_cycle_send_buff[0][0], half_cycle_send_buff[0][1], half_cycle_send_buff[0][2], half_cycle_send_buff[0][3], half_cycle_send_buff[0][4], half_cycle_send_buff[0][5]); - sprintf(half_tx_buffer_1, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[1], half_cycle_send_buff[1][0], half_cycle_send_buff[1][1], half_cycle_send_buff[1][2], half_cycle_send_buff[1][3], half_cycle_send_buff[1][4], half_cycle_send_buff[1][5]); - sprintf(half_tx_buffer_2, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[2], half_cycle_send_buff[2][0], half_cycle_send_buff[2][1], half_cycle_send_buff[2][2], half_cycle_send_buff[2][3], half_cycle_send_buff[2][4], half_cycle_send_buff[2][5]); - sprintf(half_tx_buffer_3, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[3], half_cycle_send_buff[3][0], half_cycle_send_buff[3][1], half_cycle_send_buff[3][2], half_cycle_send_buff[3][3], half_cycle_send_buff[3][4], half_cycle_send_buff[3][5]); - sprintf(half_tx_buffer_4, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[4], half_cycle_send_buff[4][0], half_cycle_send_buff[4][1], half_cycle_send_buff[4][2], half_cycle_send_buff[4][3], half_cycle_send_buff[4][4], half_cycle_send_buff[4][5]); - sprintf(half_tx_buffer_5, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[5], half_cycle_send_buff[5][0], half_cycle_send_buff[5][1], half_cycle_send_buff[5][2], half_cycle_send_buff[5][3], half_cycle_send_buff[5][4], half_cycle_send_buff[5][5]); - }else if(pd_adc_half_b_start == true) { - sprintf(half_tx_buffer_6, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[0], half_cycle_send_buff[0][0], half_cycle_send_buff[0][1], half_cycle_send_buff[0][2], half_cycle_send_buff[0][3], half_cycle_send_buff[0][4], half_cycle_send_buff[0][5]); - sprintf(half_tx_buffer_7, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[1], half_cycle_send_buff[1][0], half_cycle_send_buff[1][1], half_cycle_send_buff[1][2], half_cycle_send_buff[1][3], half_cycle_send_buff[1][4], half_cycle_send_buff[1][5]); - sprintf(half_tx_buffer_8, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[2], half_cycle_send_buff[2][0], half_cycle_send_buff[2][1], half_cycle_send_buff[2][2], half_cycle_send_buff[2][3], half_cycle_send_buff[2][4], half_cycle_send_buff[2][5]); - sprintf(half_tx_buffer_9, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[3], half_cycle_send_buff[3][0], half_cycle_send_buff[3][1], half_cycle_send_buff[3][2], half_cycle_send_buff[3][3], half_cycle_send_buff[3][4], half_cycle_send_buff[3][5]); - sprintf(half_tx_buffer_10, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[4], half_cycle_send_buff[4][0], half_cycle_send_buff[4][1], half_cycle_send_buff[4][2], half_cycle_send_buff[4][3], half_cycle_send_buff[4][4], half_cycle_send_buff[4][5]); - sprintf(half_tx_buffer_11, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[5], half_cycle_send_buff[5][0], half_cycle_send_buff[5][1], half_cycle_send_buff[5][2], half_cycle_send_buff[5][3], half_cycle_send_buff[5][4], half_cycle_send_buff[5][5]); - }else if(pd_adc_half_c_start == true) { - sprintf(half_tx_buffer_12, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[0], half_cycle_send_buff[0][0], half_cycle_send_buff[0][1], half_cycle_send_buff[0][2], half_cycle_send_buff[0][3], half_cycle_send_buff[0][4], half_cycle_send_buff[0][5]); - sprintf(half_tx_buffer_13, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[1], half_cycle_send_buff[1][0], half_cycle_send_buff[1][1], half_cycle_send_buff[1][2], half_cycle_send_buff[1][3], half_cycle_send_buff[1][4], half_cycle_send_buff[1][5]); - sprintf(half_tx_buffer_14, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[2], half_cycle_send_buff[2][0], half_cycle_send_buff[2][1], half_cycle_send_buff[2][2], half_cycle_send_buff[2][3], half_cycle_send_buff[2][4], half_cycle_send_buff[2][5]); - sprintf(half_tx_buffer_15, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[3], half_cycle_send_buff[3][0], half_cycle_send_buff[3][1], half_cycle_send_buff[3][2], half_cycle_send_buff[3][3], half_cycle_send_buff[3][4], half_cycle_send_buff[3][5]); - sprintf(half_tx_buffer_16, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[4], half_cycle_send_buff[4][0], half_cycle_send_buff[4][1], half_cycle_send_buff[4][2], half_cycle_send_buff[4][3], half_cycle_send_buff[4][4], half_cycle_send_buff[4][5]); - sprintf(half_tx_buffer_17, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[5], half_cycle_send_buff[5][0], half_cycle_send_buff[5][1], half_cycle_send_buff[5][2], half_cycle_send_buff[5][3], half_cycle_send_buff[5][4], half_cycle_send_buff[5][5]); - }else if(pd_adc_half_d_start == true) { - sprintf(half_tx_buffer_18, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[0], half_cycle_send_buff[0][0], half_cycle_send_buff[0][1], half_cycle_send_buff[0][2], half_cycle_send_buff[0][3], half_cycle_send_buff[0][4], half_cycle_send_buff[0][5]); - sprintf(half_tx_buffer_19, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[1], half_cycle_send_buff[1][0], half_cycle_send_buff[1][1], half_cycle_send_buff[1][2], half_cycle_send_buff[1][3], half_cycle_send_buff[1][4], half_cycle_send_buff[1][5]); - sprintf(half_tx_buffer_20, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[2], half_cycle_send_buff[2][0], half_cycle_send_buff[2][1], half_cycle_send_buff[2][2], half_cycle_send_buff[2][3], half_cycle_send_buff[2][4], half_cycle_send_buff[2][5]); - sprintf(half_tx_buffer_21, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[3], half_cycle_send_buff[3][0], half_cycle_send_buff[3][1], half_cycle_send_buff[3][2], half_cycle_send_buff[3][3], half_cycle_send_buff[3][4], half_cycle_send_buff[3][5]); - sprintf(half_tx_buffer_22, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[4], half_cycle_send_buff[4][0], half_cycle_send_buff[4][1], half_cycle_send_buff[4][2], half_cycle_send_buff[4][3], half_cycle_send_buff[4][4], half_cycle_send_buff[4][5]); - sprintf(half_tx_buffer_23, "Ti%d,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf,\t%lf\r\n", LED_list_half[5], half_cycle_send_buff[5][0], half_cycle_send_buff[5][1], half_cycle_send_buff[5][2], half_cycle_send_buff[5][3], half_cycle_send_buff[5][4], half_cycle_send_buff[5][5]); - } - } - /*********************/ - - buf_no = 0; - - if(ble_connection_st == 0) { - half_adc_end(); - half_send_timer_stop(); - printf("Half ADC STOP 1\r\n"); - } - else if(pd_adc_half_a_start == true) { // B mode - pd_adc_half_a_start = false; - pd_adc_half_b_start = true; - - half_adc_start(); - }else if(pd_adc_half_b_start == true) { // C mode - pd_adc_half_b_start = false; - pd_adc_half_c_start = true; - - half_adc_start(); - }else if(pd_adc_half_c_start == true) { // D mode - pd_adc_half_c_start = false; - pd_adc_half_d_start = true; - - half_adc_start(); - }else if(pd_adc_half_d_start == true) { // Completed - pd_adc_half_d_start = false; - - if(cmd_type_t == CMD_UART && prestatus==false) { - half_send_timer_stop(); - - }else if(cmd_type_t == CMD_BLE && prestatus==false) { - half_send_timer_start(); - - } - - if(ble_connection_st == BLE_CONNECTED_ST) { - battery_timer_start(); - } - - led_off(99); - pd_off(99); - } - } - } - } - } - } -} - -void half_send_loop(void * p_context) /* For x ms */ -{ - UNUSED_PARAMETER(p_context); - half_send_timer_stop(); - - - - switch(order) { - case 0: - data_tx_handler(half_tx_buffer_0); - break; - - case 1: - data_tx_handler(half_tx_buffer_1); - break; - - case 2: - data_tx_handler(half_tx_buffer_2); - break; - - case 3: - data_tx_handler(half_tx_buffer_3); - break; - - case 4: - data_tx_handler(half_tx_buffer_4); - break; - - case 5: - data_tx_handler(half_tx_buffer_5); - break; - - case 6: - data_tx_handler(half_tx_buffer_6); - break; - - case 7: - data_tx_handler(half_tx_buffer_7); - break; - - case 8: - data_tx_handler(half_tx_buffer_8); - break; - - case 9: - data_tx_handler(half_tx_buffer_9); - break; - - case 10: - data_tx_handler(half_tx_buffer_10); - break; - - case 11: - data_tx_handler(half_tx_buffer_11); - break; - - case 12: - data_tx_handler(half_tx_buffer_12); - break; - - case 13: - data_tx_handler(half_tx_buffer_13); - break; - - case 14: - data_tx_handler(half_tx_buffer_14); - break; - - case 15: - data_tx_handler(half_tx_buffer_15); - break; - - case 16: - data_tx_handler(half_tx_buffer_16); - break; - - case 17: - data_tx_handler(half_tx_buffer_17); - break; - - case 18: - data_tx_handler(half_tx_buffer_18); - break; - - case 19: - data_tx_handler(half_tx_buffer_19); - break; - - case 20: - data_tx_handler(half_tx_buffer_20); - break; - - case 21: - data_tx_handler(half_tx_buffer_21); - break; - - case 22: - data_tx_handler(half_tx_buffer_22); - break; - - case 23: - data_tx_handler(half_tx_buffer_23); - - order = 0; -#if FEATURE_PRINTF - printf("half_send Completed\r\n"); -#endif - - - return; - - default: - break; - } - order++; - if(ble_connection_st == 0) { - half_send_timer_stop(); - order = 0; - printf("Half ADC STOP 2\r\n");} - else{ - half_send_timer_start(); - } -} - - -void half_adc_start(void) -{ - pd_no = -1; - led_no = -1; - buf_no = 0; - - - if(pd_adc_half_a_start == true) { -#if FEATURE_PRINTF - printf("\r\n===== Half_A start ====================\r\n"); - printf("LED : "); -#endif - for(uint8_t i =0; i < HALF_LED_NO; i++) { - LED_list_half[i] = led_half_list_a[i]; -#if FEATURE_PRINTF - printf("%d ", LED_list_half[i]); -#endif - } -#if FEATURE_PRINTF - printf("\r\n"); - printf("PD : "); -#endif - for(uint8_t i =0; i < HALF_PD_NO; i++) { - PD_list_half[i] = pd_half_list_a[i]; -#if FEATURE_PRINTF - printf("%d ", PD_list_half[i]); -#endif - } -#if FEATURE_PRINTF - printf("\r\n\r\n"); -#endif - } - - if(pd_adc_half_b_start == true) { -#if FEATURE_PRINTF - printf("\r\n===== Half_B start ====================\r\n"); - printf("LED : "); -#endif - for(uint8_t i =0; i < HALF_LED_NO; i++) { - LED_list_half[i] = led_half_list_b[i]; -#if FEATURE_PRINTF - printf("%d ", LED_list_half[i]); -#endif - } - -#if FEATURE_PRINTF - printf("\r\n"); - printf("PD : "); -#endif - - for(uint8_t i =0; i < HALF_PD_NO; i++) { - PD_list_half[i] = pd_half_list_b[i]; -#if FEATURE_PRINTF - printf("%d ", PD_list_half[i]); -#endif - } -#if FEATURE_PRINTF - printf("\r\n\r\n"); -#endif - } - - if(pd_adc_half_c_start == true) { -#if FEATURE_PRINTF - printf("\r\n===== Half_C start ====================\r\n"); - printf("LED : "); -#endif - for(uint8_t i =0; i < HALF_LED_NO; i++) { - LED_list_half[i] = led_half_list_c[i]; -#if FEATURE_PRINTF - printf("%d ", LED_list_half[i]); -#endif - } - -#if FEATURE_PRINTF - printf("\r\n"); - printf("PD : "); -#endif - - for(uint8_t i =0; i < HALF_PD_NO; i++) { - PD_list_half[i] = pd_half_list_c[i]; -#if FEATURE_PRINTF - printf("%d ", PD_list_half[i]); -#endif - } -#if FEATURE_PRINTF - printf("\r\n\r\n"); -#endif - } - - if(pd_adc_half_d_start == true) { -#if FEATURE_PRINTF - printf("\r\n===== Half_D start ====================\r\n"); - printf("LED : "); -#endif - for(uint8_t i =0; i < HALF_LED_NO; i++) { - LED_list_half[i] = led_half_list_d[i]; -#if FEATURE_PRINTF - printf("%d ", LED_list_half[i]); -#endif - } - -#if FEATURE_PRINTF - printf("\r\n"); - printf("PD : "); -#endif - - for(uint8_t i =0; i < HALF_PD_NO; i++) { - PD_list_half[i] = pd_half_list_d[i]; -#if FEATURE_PRINTF - printf("%d ", PD_list_half[i]); -#endif - } -#if FEATURE_PRINTF - printf("\r\n\r\n"); -#endif - } - - for(uint16_t i = 0; i < 72; i++) { - for(uint16_t j = 0; j < HALF_CYCLE_CNT; j++) { - half_cycle_buff[i][j] = 0.0f; - } - } - for(uint8_t i = 0; i < HALF_LED_NO; i++) { - for(uint8_t j = 0; j < HALF_PD_NO; j++) { - half_cycle_send_buff[i][j] = 0.0f; - } - } - - half_adc_start2(); - order =0; -} - - -void half_adc_start2(void) -{ - half_adc_init(); -#if FEATURE_PRINTF - half_timer_init(); - half_timer_start(); -#else - half_irq_init(); - half_ppi_init(); - half_sampling_event_enable(); - //ada2200_start(); -#endif -} - - -void half_adc_end(void) -{ -#if FEATURE_PRINTF - printf("half_adc_end\r\n"); - half_timer_stop(); -#endif - -#if !FEATURE_PRINTF - half_sampling_event_disable(); - half_irq_uninit(); - half_ppi_uninit(); -#endif - half_adc_uninit(); - //ada2200_stop(); - nrf_delay_ms(5); - if(prestatus == true){ - printf("1st\r\n"); - if(device_activated() == 0) - {printf("2nd\r\n"); - } -} -} - - -void half_adc_init(void) -{ -#if FEATURE_PRINTF - printf("half_adc_init\r\n"); -#endif - - static nrfx_saadc_config_t default_config; - default_config.resolution = (nrf_saadc_resolution_t)NRFX_SAADC_CONFIG_RESOLUTION; /* Resolution is 10bits */ - default_config.oversample = (nrf_saadc_oversample_t)NRFX_SAADC_CONFIG_OVERSAMPLE; /* Over Sampling Disabled */ - default_config.interrupt_priority = NRFX_SAADC_CONFIG_IRQ_PRIORITY; /* Interrupt Priority is 0(Highest) */ - default_config.low_power_mode = NRFX_SAADC_CONFIG_LP_MODE; /* Low Power Mode is Disabled */ - - static nrf_saadc_channel_config_t config; - config.resistor_p = NRF_SAADC_RESISTOR_DISABLED; - config.resistor_n = NRF_SAADC_RESISTOR_DISABLED; - config.gain = NRF_SAADC_GAIN1_6; - config.reference = NRF_SAADC_REFERENCE_INTERNAL; - config.acq_time = NRF_SAADC_ACQTIME_3US; - config.mode = NRF_SAADC_MODE_DIFFERENTIAL; - config.burst = NRF_SAADC_BURST_DISABLED; - config.pin_p = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN0); - config.pin_n = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN1); - - ret_code_t err_code = nrf_drv_saadc_init(&default_config, half_voltage_handler); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_channel_init(0, &config); - APP_ERROR_CHECK(err_code); - if (prestatus==true) - { - err_code = nrf_drv_saadc_buffer_convert(pd_half_adc_buf[0], half_samples_in_buffer + 10); - } - else - { - err_code = nrf_drv_saadc_buffer_convert(pd_half_adc_buf[0], half_samples_in_buffer + m_config.pd_delay_us/16); - } - APP_ERROR_CHECK(err_code); -} - - - -void half_adc_uninit(void) -{ -#if FEATURE_PRINTF - printf("pd_half_adc_uninit\r\n"); -#endif - - nrf_drv_saadc_uninit(); - nrf_drv_saadc_channel_uninit(0); -} - - -#if !FEATURE_PRINTF -void half_irq_init(void) -{ - ret_code_t err_code; - - /* Initialize int pin */ - if (!nrfx_gpiote_is_init()) - { - err_code = nrfx_gpiote_init(); - APP_ERROR_CHECK(err_code); - } - - nrfx_gpiote_in_config_t in_config = NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(true); - in_config.pull = NRF_GPIO_PIN_PULLDOWN; - - err_code = nrfx_gpiote_in_init(ADA2200_SYNCO_PIN, &in_config, NULL); - APP_ERROR_CHECK(err_code); - - nrfx_gpiote_in_event_enable(ADA2200_SYNCO_PIN, true); -} - - -void half_irq_uninit(void) -{ - nrfx_gpiote_in_event_disable(ADA2200_SYNCO_PIN); - nrfx_gpiote_in_uninit(ADA2200_SYNCO_PIN); -} -#endif - - -void half_send_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_half_send_loop_timer_id, APP_TIMER_TICKS(HALF_SEND_LOOP_INTERVAL), NULL)); -} - - -void half_send_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_half_send_loop_timer_id)); - -} - - -void half_send_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_half_send_loop_timer_id, APP_TIMER_MODE_SINGLE_SHOT, half_send_loop)); -} - diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_half.h b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_half.h deleted file mode 100644 index e622864..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_half.h +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * @file meas_pd_voltage_half.h - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#ifndef _MEAS_PD_VOLTAGE_HALF_H__ -#define _MEAS_PD_VOLTAGE_HALF_H__ - -#include "sdk_common.h" -#include "nrf_drv_saadc.h" - -#define ADA2200_SYNCO_PIN NRF_GPIO_PIN_MAP(0,17) - -#define HALF_PD_NO 6 -#define HALF_LED_NO 6 -#define HALF_CYCLE_CNT 32 - - -void half_ppi_init(void); -void half_ppi_uninit(void); -void half_sampling_event_enable(void); -void half_sampling_event_disable(void); - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ -static void half_voltage_handler(nrf_drv_saadc_evt_t const * p_event); /* PD Voltage reading */ -void half_adc_start(void); -void half_adc_start2(void); -void half_adc_end(void); -void half_adc_init(void); -void half_adc_uninit(void); -#if !FEATURE_PRINTF -void half_irq_init(void); -void half_irq_uninit(void); -#endif - -void half_send_loop(void * p_context); /* For x ms */ -void half_send_timer_start(void); -void half_send_timer_stop(void);; -void half_send_timer_init(void); - -#endif /* _MEAS_PD_VOLTAGE_HALF_H__ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_simple.c b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_simple.c deleted file mode 100644 index c540915..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_simple.c +++ /dev/null @@ -1,421 +0,0 @@ -/******************************************************************************* - TEST medi50 Dec 23 - if(resetCount>=3) return true; 3 COUNT 25/11/04 CJ CHUN - - ******************************************************************************/ - -#include "sdk_common.h" -#include -#include -#include -#include -#include -#include "nrf.h" -#include "boards.h" -#include "app_error.h" -#include "nrf_drv_saadc.h" -#include "app_timer.h" -#include "nrfx_gpiote.h" -#include "nrf_drv_gpiote.h" -#include "nrf_drv_ppi.h" -#include "nrf_drv_timer.h" -#include "nrf_delay.h" -#include "ada2200_spi.h" -#include "battery_saadc.h" -#include "ble_nus.h" -#include "meas_pd_voltage_simple.h" -#include "main.h" -#include -//#include "fstorage.h" -#include "power_control.h" -#include "debug_print.h" - -#define PD_REF_VOLTAGE_IN_MILLIVOLTS 600.0f /**< Reference voltage (in milli volts) used by ADC while doing conversion. */ -#define PD_PRE_SCALING_COMPENSATION 6.0f /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/ -#define PD_ADC_RES_10BITS 1023.0f /**< Maximum digital value for 10-bit ADC conversion. */ - - - -// remark for avoid warning error -// static nrf_saadc_value_t pressure_adc_buf[2]; // chanul 2ea for simple each 1ea - - - -/**@brief Macro to convert the result of ADC conversion in millivolts. - - - - * - * @param[in] ADC_VALUE ADC result. - * - * @retval Result converted to millivolts. - */ -#define PD_VOUT_IN_MILLI_VOLTS(ADC_VALUE)\ - (((((ADC_VALUE) * PD_REF_VOLTAGE_IN_MILLIVOLTS) / PD_ADC_RES_10BITS) * PD_PRE_SCALING_COMPENSATION)*2) - -#define SIM_SAMPLES_IN_BUFFER 128 -static nrf_saadc_value_t pd_adc_buf[2][SIM_SAMPLES_IN_BUFFER]; - -uint8_t simple_samples_in_buffer = 8; - -#define SAMPLE_CYCLE_CNT 128 - -float simple_cycle_buff[SAMPLE_CYCLE_CNT]; /* For Cycle-8, Cycle-16, Cycle-24, Cycle-32 */ -float simple_cycle_send_buff = 0.0f; -int16_t bi_simple_cycle_buff[SAMPLE_CYCLE_CNT]; -uint16_t ubi_simple_cycle_buff[SAMPLE_CYCLE_CNT];/* For Cycle-8, Cycle-16, Cycle-24, Cycle-32 */ -int16_t bi_simple_cycle_send_buff = 0; -extern uint8_t ble_bin_buffer[BLE_NUS_MAX_DATA_LEN] ; -static nrf_ppi_channel_t m_ppi_channel; -extern uint8_t m_pd_adc_cnt; -extern char ble_tx_buffer[BLE_NUS_MAX_DATA_LEN]; -extern bool lock_check; -extern which_cmd_t cmd_type_t; -#if FEATURE_CHAMBER_AUTO_TEST -extern auto_meas_mode_t auto_test_mode; -#endif -extern volatile bool ble_connection_st; -extern bool ble_got_new_data; -bool con_single; -uint8_t rep = 0; -extern uint8_t resetCount; //cj add -//APP_TIMER_DEF(m_simple_send_loop_timer_id); - -//#define SIMPLE_SEND_LOOP_INTERVAL 100 - -#define PATTERN_LENGTH 8 -#define NORMAL_AMPLITUDE_THRESHOLD 40 // values above ~50 in magnitude are normal - -bool is_lockin_pattern(int16_t *pattern, uint8_t length) { - int16_t avg_amplitude = 0; - uint8_t positive_count = 0; - uint8_t negative_count = 0; - - // Calculate average amplitude and count positives/negatives - for (uint8_t i = 0; i < length; i++) { - int16_t value = pattern[i]; - avg_amplitude += abs(value); - - if (value >= 0) { - positive_count++; - } else { - negative_count++; - } - } - - avg_amplitude /= length; - DBG_PRINTF("lock avg amplitude=%d,p_c=%d,n_c=%d\r\n\r\n", avg_amplitude,positive_count,negative_count); - // Check conditions: - // - Large enough average amplitude - // - Exactly 1 positive and (length - 1) negative values - if(resetCount>=3) return true; - - if (avg_amplitude > NORMAL_AMPLITUDE_THRESHOLD && - positive_count == 1 && negative_count == (length - 1)) { - return true; // lock-in (normal) pattern - } else { - - return false; // abnormal pattern - } -} - - -void simple_ppi_init(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_init(); - APP_ERROR_CHECK(err_code); - - uint32_t gpiote_event_addr = nrf_drv_gpiote_in_event_addr_get(ADA2200_SYNCO_PIN); - uint32_t saadc_sample_task_addr = nrf_drv_saadc_sample_task_get(); - - /* setup ppi channel so that timer compare event is triggering sample task in SAADC */ - err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_ppi_channel_assign(m_ppi_channel, - gpiote_event_addr, - saadc_sample_task_addr); - APP_ERROR_CHECK(err_code); -} - - -void simple_ppi_uninit(void) -{ - ret_code_t err_code; - - err_code = nrf_drv_ppi_uninit(); - APP_ERROR_CHECK(err_code); -} - - -void simple_sampling_event_enable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} - - -void simple_sampling_event_disable(void) -{ - ret_code_t err_code = nrf_drv_ppi_channel_disable(m_ppi_channel); - APP_ERROR_CHECK(err_code); -} - - -/**@brief Function for handling the ADC interrupt. - * - * @details This function will fetch the conversion result from the ADC, convert the value into - * percentage and send it to peer. - */ - - -static void simple_voltage_handler(nrf_drv_saadc_evt_t const * p_event) -{ - ret_code_t err_code; - - if (p_event->type == NRF_DRV_SAADC_EVT_DONE) - { - // ? ??? ?? - err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, simple_samples_in_buffer); - APP_ERROR_CHECK(err_code); - - for(uint8_t i = 0; i < simple_samples_in_buffer; i++) { - bi_simple_cycle_buff[i] = p_event->data.done.p_buffer[i]; - } - - simple_mesurement_stop(); - - simple_cycle_send_buff = 0; - bi_simple_cycle_send_buff = 0; - - for(uint8_t i = 0; i < simple_samples_in_buffer; i++) { - simple_cycle_buff[i] = PD_VOUT_IN_MILLI_VOLTS(bi_simple_cycle_buff[i]); - bi_simple_cycle_send_buff += bi_simple_cycle_buff[i]; - simple_cycle_send_buff += simple_cycle_buff[i]; - } - - // ? BLE ?? (if? ??? ??!) - if(cmd_type_t == CMD_UART) { - DBG_PRINTF("Th%f\r\n\r\n", simple_cycle_send_buff); - DBG_PRINTF("MOD: %f,%f,%f,%f,%f,%f,%f,%f\r\n", - simple_cycle_buff[0], simple_cycle_buff[1], - simple_cycle_buff[2], simple_cycle_buff[3], - simple_cycle_buff[4], simple_cycle_buff[5], - simple_cycle_buff[6], simple_cycle_buff[7]); - - } else if(cmd_type_t == CMD_BLE) { - DBG_PRINTF("Th%f\r\n\r\n", simple_cycle_send_buff); - DBG_PRINTF("MOD: %f,%f,%f,%f,%f,%f,%f,%f\r\n", - simple_cycle_buff[0], simple_cycle_buff[1], - simple_cycle_buff[2], simple_cycle_buff[3], - simple_cycle_buff[4], simple_cycle_buff[5], - simple_cycle_buff[6], simple_cycle_buff[7]); - - // ? BLE ?? - for(uint8_t i = 0; i < simple_samples_in_buffer; i++) { - ubi_simple_cycle_buff[i] = (uint16_t)bi_simple_cycle_buff[i]; - } - - format_data(ble_bin_buffer, "rsh:", ubi_simple_cycle_buff, (m_pd_adc_cnt*2)); - binary_tx_handler(ble_bin_buffer, (m_pd_adc_cnt+2)); - } - - // ? Lock-in ?? ?? - if (lock_check == true) { - if (is_lockin_pattern(bi_simple_cycle_buff, 8) == false) { - if(device_reactivated() == 0) { - DBG_PRINTF("reset!!\r\n"); - } - } - resetCount++; - DBG_PRINTF("Reset Count :%d\r\n", resetCount); - } - - } // ? if (NRF_DRV_SAADC_EVT_DONE) ??? ?? -} - - - - -/* - -static void simple_voltage_handler(nrf_drv_saadc_evt_t const * p_event) -{ - ret_code_t err_code; - - if (p_event->type == NRF_DRV_SAADC_EVT_DONE) - { - - err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, simple_samples_in_buffer); - APP_ERROR_CHECK(err_code); - - for(uint8_t i = 0; i < simple_samples_in_buffer; i++) { - bi_simple_cycle_buff[i] = p_event->data.done.p_buffer[i]; - } - - simple_mesurement_stop(); - - simple_cycle_send_buff = 0; - bi_simple_cycle_send_buff = 0; - - for(uint8_t i = 0; i < simple_samples_in_buffer; i++) { - - simple_cycle_buff[i] = PD_VOUT_IN_MILLI_VOLTS(bi_simple_cycle_buff[i]); - //simple_cycle_buff[i] = simple_cycle_buff[i] * -1; - bi_simple_cycle_send_buff += bi_simple_cycle_buff[i]; - simple_cycle_send_buff += simple_cycle_buff[i]; - } - } - - - if(con_single==true) - { - //return; - } - - else - { - if(cmd_type_t == CMD_UART) { - DBG_PRINTF("Th%f\r\n\r\n", simple_cycle_send_buff); - DBG_PRINTF( "MOD: %f,%f,%f,%f,%f,%f,%f,%f\r\n", simple_cycle_buff[0], simple_cycle_buff[1], simple_cycle_buff[2], simple_cycle_buff[3], simple_cycle_buff[4] - , simple_cycle_buff[5], simple_cycle_buff[6], simple_cycle_buff[7]); - } else if(cmd_type_t == CMD_BLE) { -// if(lock_check == true){ - DBG_PRINTF("Th%f\r\n\r\n", simple_cycle_send_buff); - DBG_PRINTF( "MOD: %f,%f,%f,%f,%f,%f,%f,%f\r\n", simple_cycle_buff[0], simple_cycle_buff[1], simple_cycle_buff[2], simple_cycle_buff[3], simple_cycle_buff[4] - , simple_cycle_buff[5], simple_cycle_buff[6], simple_cycle_buff[7]); - - for(uint8_t i = 0; i < simple_samples_in_buffer; i++) { - ubi_simple_cycle_buff[i] = (uint16_t)bi_simple_cycle_buff[i]; - } - - format_data(ble_bin_buffer, "rsh:", ubi_simple_cycle_buff, (m_pd_adc_cnt*2)); - - binary_tx_handler(ble_bin_buffer,(m_pd_adc_cnt+2)); - - } - - - - } - if (lock_check == true) { - if (is_lockin_pattern(bi_simple_cycle_buff,8) == false){ - - if(device_reactivated() == 0) - { - DBG_PRINTF("reset!!\r\n"); - } - - } - resetCount++; - DBG_PRINTF("Reset Count :%d \r\n",resetCount); -} - else - { - } -} - - -*/ - -void simple_adc_init(void) -{ - static nrfx_saadc_config_t default_config; - default_config.resolution = (nrf_saadc_resolution_t)NRFX_SAADC_CONFIG_RESOLUTION; /* Resolution is 10bits */ - default_config.oversample = (nrf_saadc_oversample_t)NRFX_SAADC_CONFIG_OVERSAMPLE; /* Over Sampling Disabled */ - default_config.interrupt_priority = NRFX_SAADC_CONFIG_IRQ_PRIORITY; /* Interrupt Priority is 0(Highest) */ - default_config.low_power_mode = NRFX_SAADC_CONFIG_LP_MODE; /* Low Power Mode is Disabled */ - - static nrf_saadc_channel_config_t config; - config.resistor_p = NRF_SAADC_RESISTOR_DISABLED; - config.resistor_n = NRF_SAADC_RESISTOR_DISABLED; - config.gain = NRF_SAADC_GAIN1_6; - config.reference = NRF_SAADC_REFERENCE_INTERNAL; - config.acq_time = NRF_SAADC_ACQTIME_3US; - config.mode = NRF_SAADC_MODE_DIFFERENTIAL; - config.burst = NRF_SAADC_BURST_DISABLED; - config.pin_p = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN0); - config.pin_n = (nrf_saadc_input_t)(NRF_SAADC_INPUT_AIN1); - - ret_code_t err_code = nrf_drv_saadc_init(&default_config, simple_voltage_handler); - APP_ERROR_CHECK(err_code); - - err_code = nrf_drv_saadc_channel_init(0, &config); - APP_ERROR_CHECK(err_code); - if(con_single==true){ - err_code = nrf_drv_saadc_buffer_convert(pd_adc_buf[0], SIM_SAMPLES_IN_BUFFER); - APP_ERROR_CHECK(err_code); - } - else{ - err_code = nrf_drv_saadc_buffer_convert(pd_adc_buf[0], simple_samples_in_buffer); - APP_ERROR_CHECK(err_code); - } - -} - - -void simple_adc_uninit(void) -{ - nrf_drv_saadc_uninit(); - nrf_drv_saadc_channel_uninit(0); -} - - -void simple_irq_init(void){ - ret_code_t err_code; - - /* Initialize int pin */ - if (!nrfx_gpiote_is_init()) - { - err_code = nrfx_gpiote_init(); - APP_ERROR_CHECK(err_code); - } - - nrfx_gpiote_in_config_t in_config = NRFX_GPIOTE_CONFIG_IN_SENSE_LOTOHI(true); - in_config.pull = NRF_GPIO_PIN_PULLDOWN; - - err_code = nrfx_gpiote_in_init(ADA2200_SYNCO_PIN, &in_config, NULL); - APP_ERROR_CHECK(err_code); - - nrfx_gpiote_in_event_enable(ADA2200_SYNCO_PIN, true); -} - - -void simple_irq_uninit(void){ - - nrfx_gpiote_in_event_disable(ADA2200_SYNCO_PIN); - nrfx_gpiote_in_uninit(ADA2200_SYNCO_PIN); -} - - -void simple_mesurement_start(void){ - - battery_timer_stop(); - nrf_delay_ms(10); - memset(simple_cycle_buff, 0, SAMPLE_CYCLE_CNT); - nrf_delay_ms(10); - simple_irq_init(); - nrf_delay_ms(10); - simple_adc_init(); - nrf_delay_ms(10); - simple_ppi_init(); - nrf_delay_ms(10); - simple_sampling_event_enable(); - nrf_delay_ms(10); -} - - -void simple_mesurement_stop(void){ - - if(ble_connection_st == 1) { - battery_timer_start(); - } - - - simple_sampling_event_disable(); - simple_adc_uninit(); - simple_ppi_uninit(); - simple_irq_uninit(); -} diff --git a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_simple.h b/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_simple.h deleted file mode 100644 index 6761d2f..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/meas_pd_voltage_simple.h +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************************* - * @file meas_pd_voltage_simple.h - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#ifndef _MEAS_PD_VOLTAGE_SIMPLE_H__ -#define _MEAS_PD_VOLTAGE_SIMPLE_H__ - -#include "sdk_common.h" - -#define ADA2200_SYNCO_PIN NRF_GPIO_PIN_MAP(0,17) - - -void simple_ppi_init(void); -void simple_ppi_uninit(void); -void simple_sampling_event_enable(void); -void simple_sampling_event_disable(void); -void simple_adc_init(void); -void simple_adc_uninit(void); -void simple_irq_init(void); -void simple_irq_uninit(void); -void simple_mesurement_start(void); -void simple_mesurement_stop(void); - - -void simple_send_loop(void * p_context); /* For x ms */ -void simple_send_timer_start(void); -void simple_send_timer_stop(void);; -void simple_send_timer_init(void); -#endif /* _MEAS_PD_VOLTAGE_SIMPLE_H__ */ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/measurements.c b/project/ble_peripheral/ble_app_bladder_patch/measurements.c deleted file mode 100644 index d2ef509..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/measurements.c +++ /dev/null @@ -1,867 +0,0 @@ -/******************************************************************************* - * @file measurements.c - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#include "sdk_common.h" - -#include -#include -#include -#include -#include "nrf.h" -#include "nrf_drv_gpiote.h" -#include "nrf_drv_spi.h" -#include "nrf_drv_saadc.h" -#include "nrf_drv_ppi.h" -#include "nrf_drv_timer.h" -#include "boards.h" -#include "bsp.h" -#include "app_error.h" -#include "nrf_delay.h" -#include "app_util_platform.h" -#include "nrf_pwr_mgmt.h" - -#include "nrf_log.h" -#include "ble_nus.h" -#include "LED_Parse.h" -#include "app_timer.h" -#include "measurements.h" -#include "main.h" -//#include "fstorage.h" -#include "ad5272_i2c.h" -#include "mcp4725_i2c.h" -#include -#include "debug_print.h" -#include "i2c_manager.h" -//#define trig_18 NRF_GPIO_PIN_MAP(0,18) -//#define tris_18_CONFIG() nrf_gpio_cfg_output(trig_18) -//#define trig_on() nrf_gpio_pin_set(trig_18) -//#define trig_off() nrf_gpio_pin_clear(trig_18) -#define LED_NUM 24 // -uint8_t activated_led = 99; -uint8_t activated_pd = 99; -APP_TIMER_DEF(m_mea_send_loop_timer_id); -static uint8_t cnt =0; -#define MEA_SEND_LOOP_INTERVAL 100 -char mea_tx_buffer[BLE_NUS_MAX_DATA_LEN]; -extern volatile bool processing; -/* Default Value before initialized. Set value for Default!!! */ /* 초기값 설정 */ -/* 0번은 사용하지 않음 = NULL, 1 ~ 24까지 사용 */ -/*AD5272 DP에 쓸수 있는 값 범위는 0 ~ 1023 */ -//uint16_t led_power_dp[LED_NUM] = { -// -// 0,25,25,18,19,24,24,25,25,18,19,25,23,25,25,18,19,24,24,25,25,19,20,25 -//}; -//uint16_t led_power_dp[48] = -// {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47}; -// -/*LED0 = NULL 사용하지 않음, LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8, LED9, LED10, LED11, LED12, LED13, LED14, LED15, LED16, LED17, LED18, LED19, LED20, LED21, LED22, LED23, LED24 */ -/*MCP4725 를 0.1V(125) ~ 1.1V(1366) 값을 사용 */ -//uint16_t led_pd_dac_v[LED_NUM] = -// {1000, 1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, /* PD0 */ -// 1000, 1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000}; /* PD1 */ -// - uint16_t led_pd_dac_v[LED_NUM] = - {1000, 1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000, 1000, 1000, 1000, 1000,1000, 1000, 1000}; /* PD0 */ // 48 에서 24 변경 cj chun - -uint16_t led_off_dac_v =1360; -uint8_t led_off_pd = 0; - -/*ello Annapalu - -As Wojtek already stated you cannot use the nrf_gpio_pin_read to read a pin set as an output. If you look at figure 21, page 112 in the nRF52832 product specification you can see the PIN(0).IN register, it is this register that is read by the gpio_pin_read function. When a pin is set as an output the PIN(0).CNF.DIR switch will close on the output side and open on the input side, meaning it is physically impossible to read the actual output value of the pin with the input register. - -Wojtek is also correct that the NRF_GPIO->OUT only shows whether you have set the register, and not the actual pin state. - -To achieve what you want you could connect a second GPIO, configured as an input, to the same circuit. This would tell you whether the voltage is high or low. - -If you need to see a more accurate reading of the voltage level, to detect deviation, you could use the ADC or Comparator. - -EDIT: 23.03.17 14:40 - -I have looked further into this and it seems I was a bit hasty in my reply. The product specification shows the control signal of the two above mentioned switches are different. PIN(0).CNF.DIR for the output and PIN(0).CNF.INPUT for the input buffer.So it seems it is possible to read the output value (high or low) of an output pin using the nrf_gpio_pin_read function, if you both set the direction of the pin to output, and connect the input buffer. This can be done with the nrf_gpio_cfg() function. Note that the nrf_gpio_cfg_output() function disconnects the input buffer. - -I have tested it on the PCA10040 both with a led toggling based on it's own pin_read value, and with 4 leds switching based on the input value of one of the other led pins, all are configured as outputs. -*/ - - -void led_pd_gain_array_printout(void) -{ - - - cnt=0; - - mea_send_timer_start(); -} -void mea_send_loop(void * p_context) /* For x ms */ -{ - - - UNUSED_PARAMETER(p_context); - DBG_PRINTF("\r\n1CNT =%d\r\n",cnt); - mea_send_timer_stop(); - - - if (cnt < 6) - { - uint8_t i = (int)(cnt); - if (cnt<3){ -// sprintf(mea_tx_buffer, "Tag-Currrnt %d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", i, led_pd_dac_v[i][0], led_pd_dac_v[i][1], led_pd_dac_v[i][2], led_pd_dac_v[i][3], led_pd_dac_v[i][4], led_pd_dac_v[i][5], led_pd_dac_v[i][6], led_pd_dac_v[i][7],led_pd_dac_v[i][8], led_pd_dac_v[i][9], led_pd_dac_v[i][10], -// led_pd_dac_v[i][11], led_pd_dac_v[i][12], led_pd_dac_v[i][13], led_pd_dac_v[i][14], led_pd_dac_v[i][15], led_pd_dac_v[i][16], led_pd_dac_v[i][17],led_pd_dac_v[i][18], led_pd_dac_v[i][19], led_pd_dac_v[i][20], led_pd_dac_v[i][21],led_pd_dac_v[i][22], led_pd_dac_v[i][23]); -// data_tx_handler(mea_tx_buffer); } - sprintf(mea_tx_buffer, "Tag-Currrnt %d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", i, led_pd_dac_v[0], led_pd_dac_v[1], led_pd_dac_v[2], led_pd_dac_v[3], led_pd_dac_v[4], led_pd_dac_v[5], led_pd_dac_v[6], led_pd_dac_v[7],led_pd_dac_v[8], led_pd_dac_v[9], led_pd_dac_v[10], - - - led_pd_dac_v[11], led_pd_dac_v[12], led_pd_dac_v[13], led_pd_dac_v[14], led_pd_dac_v[15], led_pd_dac_v[16], led_pd_dac_v[17],led_pd_dac_v[18], led_pd_dac_v[19], led_pd_dac_v[20], led_pd_dac_v[21],led_pd_dac_v[22], led_pd_dac_v[23]); - - - data_tx_handler(mea_tx_buffer); } - else{ - - - - } - DBG_PRINTF("\r\n2CNT =%d\r\n",cnt); - - mea_send_timer_start(); - -// switch(cnt){ -// case 0: -// break; -// case 1: -// sprintf(mea_tx_buffer, "Tag-Currrnt %d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", i, 0,led_pd_dac_v_led_1[1], led_pd_dac_v_led_2[1], led_pd_dac_v_led_3[1], led_pd_dac_v_led_4[1], led_pd_dac_v_led_5[1], led_pd_dac_v_led_6[1], led_pd_dac_v_led_7[1], led_pd_dac_v_led_8[1], -// led_pd_dac_v_led_9[1], led_pd_dac_v_led_10[1], led_pd_dac_v_led_11[1], led_pd_dac_v_led_12[1], led_pd_dac_v_led_13[1], led_pd_dac_v_led_14[1], led_pd_dac_v_led_15[1], led_pd_dac_v_led_16[1], led_pd_dac_v_led_17[1],led_pd_dac_v_led_18[1], -// led_pd_dac_v_led_19[1], led_pd_dac_v_led_20[1],led_pd_dac_v_led_21[1], led_pd_dac_v_led_22[1],led_pd_dac_v_led_23[1], led_pd_dac_v_led_24[1]); -// break; -// case 2: -// sprintf(mea_tx_buffer, "Tag-Currrnt %d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", i, 0, led_pd_dac_v_led_1[1], led_pd_dac_v_led_2[1], led_pd_dac_v_led_3[1], led_pd_dac_v_led_4[1], led_pd_dac_v_led_5[1], led_pd_dac_v_led_6[1], led_pd_dac_v_led_7[1], led_pd_dac_v_led_8[1], -// led_pd_dac_v_led_9[1], led_pd_dac_v_led_10[1], led_pd_dac_v_led_11[1], led_pd_dac_v_led_12[1], led_pd_dac_v_led_13[1], led_pd_dac_v_led_14[1], led_pd_dac_v_led_15[1], led_pd_dac_v_led_16[1], led_pd_dac_v_led_17[1],led_pd_dac_v_led_18[1], -// led_pd_dac_v_led_19[1], led_pd_dac_v_led_20[1],led_pd_dac_v_led_21[1], led_pd_dac_v_led_22[1],led_pd_dac_v_led_23[1], led_pd_dac_v_led_24[1]); -// break; -// case 3: -// sprintf(mea_tx_buffer, "Tag-Currrnt %d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", i,0, led_pd_dac_v_led_1[1], led_pd_dac_v_led_2[1], led_pd_dac_v_led_3[1], led_pd_dac_v_led_4[1], led_pd_dac_v_led_5[1], led_pd_dac_v_led_6[1], led_pd_dac_v_led_7[1], led_pd_dac_v_led_8[1], -// led_pd_dac_v_led_9[1], led_pd_dac_v_led_10[1], led_pd_dac_v_led_11[1], led_pd_dac_v_led_12[1], led_pd_dac_v_led_13[1], led_pd_dac_v_led_14[1], led_pd_dac_v_led_15[1], led_pd_dac_v_led_16[1], led_pd_dac_v_led_17[1],led_pd_dac_v_led_18[1], -// led_pd_dac_v_led_19[1], led_pd_dac_v_led_20[1],led_pd_dac_v_led_21[1], led_pd_dac_v_led_22[1],led_pd_dac_v_led_23[1], led_pd_dac_v_led_24[1]); -// break; -// default: -// break; -//// } - -// sprintf(mea_tx_buffer,"CNT_%d\r\n",cnt); -// data_tx_handler(mea_tx_buffer); -// -// mea_send_timer_start(); - - } - else - { - //battery_timer_start(); -// sprintf(mea_tx_buffer,"END \r\n"); -// data_tx_handler(mea_tx_buffer); -// printf("\r\nLED-DP Gain Array =\r\n"); -// for(uint16_t i = 0; i < LED_NUM; i++){ -// printf("%d,\t", m_config.led_power_dp[i]); -// } -// printf("\r\n"); - - DBG_PRINTF("\r\nLED-PD Gain Array =\r\n"); -// for(uint16_t i = 0; i < PD_NUM; i++){ - for(uint16_t j = 0; j < LED_NUM; j++){ - DBG_PRINTF("%d,\t", led_pd_dac_v[j]); -// } -// ///break; -// DBG_PRINTF("\r\n"); - } - DBG_PRINTF("\r\n"); - processing = false ; - } - - cnt++; - -} - - -ret_code_t led_on(uint8_t led_index) -{ - uint32_t err_code = NRF_SUCCESS; - -#if FEATURE_PRINTF - DBG_PRINTF("\tled_on, %d =====================\r\n", led_index); -#endif - -// if((led_index >= 0)&&(led_index <= 49)){ - if(led_index <= 100){ - activated_led = led_index; //LED off 적용을 위해 - - /* LED켤때 파워 셋팅한후 켜는지 결정요 */ -// if(NRF_SUCCESS != led_power_set(led_index)) { -// DBG_PRINTF("ERR!!! LED Power set\r\n"); -// return NRF_ERROR_INTERNAL; -// } - //nrf_gpio_pin_set(trig_18); -trig_SW(true); - - - if(NRF_SUCCESS != led_select(led_index)){ - DBG_PRINTF("ERR!!! LED Select\r\n"); - return NRF_ERROR_INTERNAL; - } - -// VCSEL_SW(true); - - }else{ - DBG_PRINTF("ERR!!! led_index Failed! %d\r\n", led_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -ret_code_t led_off(uint8_t led_index) -{ - uint32_t err_code = NRF_SUCCESS; -trig_SW(false); - -#if FEATURE_PRINTF - DBG_PRINTF("led_off\r\n"); -#endif - - if(led_index == 99){ - LED_ALLOFF(); - - activated_led = 99; - } - else if(led_index == 98){ - LED99(); - DBG_PRINTF("clear \r\n"); - activated_led = 98; - } - else{ - DBG_PRINTF("ERR!!! led_index Failed! %d\r\n", led_index); - return NRF_ERROR_INTERNAL; - } - uint32_t port_state0 = nrf_gpio_port_out_read(NRF_P0); - uint32_t port_state1 = nrf_gpio_port_out_read(NRF_P1); -// DBG_PRINTF("test : %d, %d \r\n",port_state0,port_state1); -// DBG_PRINTF("LIGHT ON1 : %d \r\n",port_state0>>22&1); -// DBG_PRINTF("LIGHT ON2 : %d \r\n",port_state0>>23&1); -// DBG_PRINTF("LED_SEL_SW1 : %d \r\n",port_state1>>4&1); -// DBG_PRINTF("LED_SEL_SW2 : %d \r\n",port_state1>>5&1); -// DBG_PRINTF("LED_SEL_SW3 : %d \r\n",port_state1>>6&1); -// DBG_PRINTF("LED_INDIV_SEL_SW1 : %d \r\n",port_state1>>1&1); -// DBG_PRINTF("LED_INDIV_SEL_SW2 : %d \r\n",port_state1>>2&1); -// DBG_PRINTF("LED_INDIV_SEL_SW3 : %d \r\n",port_state1>>3&1); - return err_code; -} -ret_code_t led_pd_mod_set(uint16_t mod_gain) -{ - uint32_t err_code = NRF_SUCCESS; - -// if(((led_index >= 0)&&(led_index <= 49))||((pd_index >= 0)&&(pd_index <= 2))){ - if(mod_gain <= 2000){ - - sw_i2c_init_once(); - - mcp4725_writeFastMode( mod_gain); - - - if(NRF_SUCCESS != pd_on(2)){ //0~23 ==pd0 24~47 == pd1 - DBG_PRINTF("ERR!!! MOD_on\r\n"); - return NRF_ERROR_INTERNAL; - } - - }else{ - DBG_PRINTF("ERR!!! lockin Test Failed! \r\n"); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} -ret_code_t led_pd_matching_value_set(uint8_t led_index) -{ - uint32_t err_code = NRF_SUCCESS; - - - -// if(((led_index >= 0)&&(led_index <= 49))||((pd_index >= 0)&&(pd_index <= 2))){ - if(led_index <= 100){ - - - if(NRF_SUCCESS != pd_gain_set(led_index)){ - DBG_PRINTF("ERR!!! pd_gain_set\r\n"); - return NRF_ERROR_INTERNAL; - } - uint8_t pd_index; - - if(led_index<24) - {pd_index =0; - } - else if ((led_index<48) && (led_index>23) ) - {pd_index =1; - } - else if (led_index==99) - { - pd_index = led_off_pd; - } - - if(NRF_SUCCESS != pd_on(pd_index)){ //0~23 ==pd0 24~47 == pd1 - DBG_PRINTF("ERR!!! pd_on\r\n"); - return NRF_ERROR_INTERNAL; - } - - }else{ - DBG_PRINTF("ERR!!! led_indexFailed! %d\r\n", led_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -ret_code_t pd_on(uint8_t pd_index) -{ - uint32_t err_code = NRF_SUCCESS; -#if FEATURE_FOR_SCOPE - nrf_gpio_pin_set(PD_CLK_26); - nrf_gpio_pin_clear(PD_CLK_26); -#endif - -#if FEATURE_PRINTF - DBG_PRINTF("pd_on, %d ===== \r\n", pd_index); -#endif - -// if((pd_index >= 0)&&(pd_index <= 2)){ - if(pd_index <= 3){ - activated_pd = pd_index; - //DBG_PRINTF("pd_on %d\r\n", pd_index); - if(NRF_SUCCESS != pd_select(pd_index)){ - DBG_PRINTF("ERR!!! pd_on Failed! %d\r\n", pd_index); - return NRF_ERROR_INTERNAL; - } - - }else{ - DBG_PRINTF("ERR!!! pd_index Failed! %d\r\n", pd_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -ret_code_t pd_off(uint8_t pd_index) -{ - uint32_t err_code = NRF_SUCCESS; - -#if FEATURE_PRINTF - DBG_PRINTF("pd_off\r\n"); -#endif - - if(pd_index == 99){ - PD_ALLOFF(); - activated_pd = 99; - }else{ - DBG_PRINTF("ERR!!! PD Off Failed! %d\r\n", pd_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - -void led_power_read_48(uint16_t *data) -{ - - - -for(uint8_t i = 0 ; i<24 ;i++){ //48 >24 - - data[i] = LED_READ_ROM(i); - - nrf_delay_ms(1); - } - // nrf_delay_ms(20); - - - - - - - -} -int16_t led_power_read(uint8_t led_index) -{ - int16_t led_power; -// if((led_index >= 0)&&(led_index <= 49)){ - if(led_index <= 47){ - //led_power = led_power_dp[led_index]; - led_power = LED_READ_ROM(led_index); - }else{ - DBG_PRINTF("ERR!!! led_index Failed! %d\r\n", led_index); - return NRF_ERROR_INTERNAL; - } - - return led_power; -} - - -ret_code_t led_power_save_mem(uint8_t led_index, int16_t led_power) /* 커맨드에 의해서 LED파워 값을 저장할때 */ -{ - uint32_t err_code = NRF_SUCCESS; -// if(((led_index >= 0)&&(led_index <= 49))||((led_power >= 0)&&(led_power <= 255))){ - if((led_index <= 47)||(led_power <= 255)){ -// led_power_dp[led_index] = led_power; - - - if(NRF_SUCCESS != LED_WRITE_ROM(led_index,led_power)){ - DBG_PRINTF("ERR!!! DS3930 1\r\n"); - err_code = NRF_ERROR_INTERNAL; - - } - - }else{ - DBG_PRINTF("ERR!!! led_index || pd_index Failed! %d, %d\r\n", led_index, led_power); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - -ret_code_t led_power_save_mem_6(uint8_t led_index, int16_t led_power) /* 커맨드에 의해서 LED파워 값을 저장할때 */ -{ - uint32_t err_code = NRF_SUCCESS; - -// if(((led_index >= 0)&&(led_index <= 49))||((led_power >= 0)&&(led_power <= 255))){ -// if((led_index <= 47)||(led_power <= 255)){ -// led_power_dp[led_index] = led_power; - -// for(uint8_t i = 0 ; i<48 ;i++){ -// if(NRF_SUCCESS != LED_WRITE_ROM(led_index,led_power)){ -// DBG_PRINTF("ERR!!! DS3930 1\r\n"); -// err_code = NRF_ERROR_INTERNAL; -for(uint8_t i = 0 ; i<48 ;i++){ - -// led_power_dp[i] = led_power; Fstorage garbage -if(NRF_SUCCESS != LED_WRITE_ROM(i,led_power)){ - DBG_PRINTF("ERR!!! DS3930 1\r\n"); - err_code = NRF_ERROR_INTERNAL; - - } - // nrf_delay_ms(20); - - - else{ -// DBG_PRINTF("ERR!!! led_index Failed! %d\r\n", led_index); -// return NRF_ERROR_INTERNAL; - } - - nrf_delay_ms(10); -} -return err_code; -} -ret_code_t led_power_save_mem_48(uint8_t *led_power) /* 커맨드에 의해서 LED파워 값을 저장할때 */ -{ - uint32_t err_code = NRF_SUCCESS; - -// if(((led_index >= 0)&&(led_index <= 49))||((led_power >= 0)&&(led_power <= 255))){ -// if((led_index <= 47)||(led_power <= 255)){ -// led_power_dp[led_index] = led_power; - -// for(uint8_t i = 0 ; i<48 ;i++){ -// if(NRF_SUCCESS != LED_WRITE_ROM(led_index,led_power)){ -// DBG_PRINTF("ERR!!! DS3930 1\r\n"); -// err_code = NRF_ERROR_INTERNAL; -for(uint8_t i = 0 ; i<48 ;i++){ - - //led_power_dp[i] = led_power; -if(NRF_SUCCESS != LED_WRITE_ROM(i,(int16_t)(led_power[i]))){ - DBG_PRINTF("ERR!!! DS3930 1\r\n"); - err_code = NRF_ERROR_INTERNAL; - - } - // nrf_delay_ms(20); - - - else{ -// DBG_PRINTF("ERR!!! led_index Failed! %d\r\n", led_index); -// return NRF_ERROR_INTERNAL; - } - - nrf_delay_ms(10); -} -return err_code; -} -//void led_power_span(uint8_t led_index) -//{ -// uint32_t err_code = NRF_SUCCESS; -// -// for(uint8_t i= 0 ;i<255 ;i++){ -// if(NRF_SUCCESS != LED_WRITE_ROM(led_index,i)){ -// DBG_PRINTF("ERR!!! DS3930 1\r\n"); -// err_code = NRF_ERROR_INTERNAL; -// } -// nrf_delay_ms(20); -// } -// DBG_PRINTF("DS3930 1\r\n"); -// } -ret_code_t led_power_set(uint8_t led_index) /* LED켤때 사용, 메모리 값을 디지털포텐셔미터에 입력 */ -{ - uint32_t err_code = NRF_SUCCESS; -// int16_t led_power; //no need - -// if((led_index >= 1)&&(led_index <= 24)){ - -// led_power = led_power_dp[led_index]; - -// if(NRF_SUCCESS != ad5272_write_rdac(led_power)) { /* LED를 켜기전에 메모리에 저장된 파워값을 DAC에 설정 */ -// DBG_PRINTF("ERR!!! ad5272_write_rdac 2\r\n"); -// err_code = NRF_ERROR_INTERNAL; -// } - -// }else{ -// DBG_PRINTF("ERR!!! led_index Failed! %d\r\n", led_index); -// return NRF_ERROR_INTERNAL; -// } - - return err_code; -} - - -ret_code_t pd_gain_set(uint8_t activated_led) /* LED와 PD 매칭 값으로 On */ -{ - uint32_t err_code = NRF_SUCCESS; - - -#if FEATURE_PRINTF - DBG_PRINTF("<>\r\n",activated_led ,pd_index); -#endif - -// if(((activated_led >= 0)&&(activated_led <= 49))||((pd_index >= 0)&&(pd_index <= 2))){ - if((activated_led <= 47)){ - - sw_i2c_init_once(); - - mcp4725_writeFastMode( led_pd_dac_v[activated_led]); /* LED는 먼저 ON되어 있어 하며 그 LED번호와 PD배칭 값으로 DAC에 설정 */ - //DBG_PRINTF("dac_v %d\r\n", led_pd_dac_v[pd_index][activated_led]); - } - else if(activated_led == 99){ - mcp4725_writeFastMode( led_off_dac_v); /* LED_OFF 배칭 값으로 DAC에 설정 */ - } - else{ - DBG_PRINTF("ERR!!! led_index Failed! %d\r\n", activated_led); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - -ret_code_t imm_gain_set(uint16_t imm_dac) /* LED와 PD 매칭 값으로 On */ -{ - uint32_t err_code = NRF_SUCCESS; - - - if((imm_dac <= 2000)){ - sw_i2c_init_once();//ad cj - - mcp4725_writeFastMode( imm_dac); /* LED는 먼저 ON되어 있어 하며 그 LED번호와 PD배칭 값으로 DAC에 설정 */ - DBG_PRINTF("dac_v %d\r\n", imm_dac); - }else{ - DBG_PRINTF("ERR!!! range Failed! %d\r\n", activated_led); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - -ret_code_t led_select(uint8_t led_index) -{ - - - - uint32_t err_code = NRF_SUCCESS; - - //LED_ALLOFF(); - - - switch(led_index) { - case 0: - LED0(); - break; - - case 1: - LED1(); - break; - - case 2: - LED2(); - break; - - case 3: - LED3(); - break; - - case 4: - LED4(); - break; - - case 5: - LED5(); - break; - - - case 6: - LED6(); - break; - - case 7: - LED7(); - break; - - case 8: - LED8(); - break; - - case 9: - LED9(); - break; - - case 10: - LED10(); - break; - - case 11: - LED11(); - break; - - case 12: - LED12(); - break; - - case 13: - LED13(); - break; - - case 14: - LED14(); - break; - - case 15: - LED15(); - break; - - case 16: - LED16(); - break; - - case 17: - LED17(); - break; - - case 18: - LED18(); - break; - - case 19: - LED19(); - break; - - case 20: - LED20(); - break; - - case 21: - LED21(); - break; - - case 22: - LED22(); - break; - - case 23: - LED23(); - break; - - case 24: - LED24(); - break; - - case 25: - LED25(); - break; - - case 26: - LED26(); - break; - - case 27: - LED27(); - break; - - case 28: - LED28(); - break; - - case 29: - LED29(); - break; - - case 30: - LED30(); - break; - - case 31: - LED31(); - break; - - case 32: - LED32(); - break; - - case 33: - LED33(); - break; - - case 34: - LED34(); - break; - - case 35: - LED35(); - break; - - case 36: - LED36(); - break; - - case 37: - LED37(); - break; - - case 38: - LED38(); - break; - - case 39: - LED39(); - break; - - case 40: - LED40(); - break; - - case 41: - LED41(); - break; - - case 42: - LED42(); - break; - - case 43: - LED43(); - break; - - case 44: - LED44(); - break; - - case 45: - LED45(); - break; - - case 46: - LED46(); - break; - - case 47: - LED47(); - break; - - case 99: - LED99(); - break; - default: - err_code = NRF_ERROR_NOT_FOUND; - break; - } - nrf_delay_ms(1); -// DBG_PRINTF("LIGHT ON1 : %d \r\n",nrf_gpio_pin_read(LIGHT_ON1)); -// DBG_PRINTF("LIGHT ON2 : %d \r\n",nrf_gpio_pin_read(LIGHT_ON2)); -// DBG_PRINTF("LED_SEL_SW1 : %d \r\n",nrf_gpio_pin_read(LED_SEL_SW1)); -// DBG_PRINTF("LED_SEL_SW2 : %d \r\n",nrf_gpio_pin_read(LED_SEL_SW2)); -// DBG_PRINTF("LED_SEL_SW3 : %d \r\n",nrf_gpio_pin_read(LED_SEL_SW3)); -// DBG_PRINTF("LED_INDIV_SEL_SW1 : %d \r\n",nrf_gpio_pin_read(LED_INDIV_SEL_SW1)); -// DBG_PRINTF("LED_INDIV_SEL_SW2 : %d \r\n",nrf_gpio_pin_read(LED_INDIV_SEL_SW2)); -// DBG_PRINTF("LED_INDIV_SEL_SW3 : %d \r\n",nrf_gpio_pin_read(LED_INDIV_SEL_SW3)); - uint32_t port_state0 = nrf_gpio_port_out_read(NRF_P0); - uint32_t port_state1 = nrf_gpio_port_out_read(NRF_P1); -// DBG_PRINTF("test : %d, %d \r\n",port_state0,port_state1); - - -// DBG_PRINTF("LIGHT ON1 : %d \r\n",port_state0>>22&1); -// DBG_PRINTF("LIGHT ON2 : %d \r\n",port_state0>>23&1); -// DBG_PRINTF("LED_SEL_SW1 : %d \r\n",port_state1>>4&1); -// DBG_PRINTF("LED_SEL_SW2 : %d \r\n",port_state1>>5&1); -// DBG_PRINTF("LED_SEL_SW3 : %d \r\n",port_state1>>6&1); -// DBG_PRINTF("LED_INDIV_SEL_SW1 : %d \r\n",port_state1>>1&1); -// DBG_PRINTF("LED_INDIV_SEL_SW2 : %d \r\n",port_state1>>2&1); -// DBG_PRINTF("LED_INDIV_SEL_SW3 : %d \r\n",port_state1>>3&1); - return err_code; -} - - -ret_code_t pd_select(uint8_t pd_index) -{ - uint32_t err_code = NRF_SUCCESS; - - PD_ALLOFF(); - - switch(pd_index) { - case 0: - PD0(); - break; - - case 1: - PD1(); - break; - - case 2: - MOD(); - break; - - case 3: - MOD2(); - break; - - default: - err_code = NRF_ERROR_NOT_FOUND; - break; - } - - - - - - return err_code; -} -void mea_send_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_mea_send_loop_timer_id, APP_TIMER_TICKS(MEA_SEND_LOOP_INTERVAL), NULL)); -} - - -void mea_send_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_mea_send_loop_timer_id)); - -} - - -void mea_send_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_mea_send_loop_timer_id, APP_TIMER_MODE_SINGLE_SHOT, mea_send_loop)); -} - diff --git a/project/ble_peripheral/ble_app_bladder_patch/measurements.h b/project/ble_peripheral/ble_app_bladder_patch/measurements.h deleted file mode 100644 index 889ecd3..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/measurements.h +++ /dev/null @@ -1,666 +0,0 @@ -/******************************************************************************* - * @file measurements.h - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#ifndef _MEASUREMENTS_H__ -#define _MEASUREMENTS_H__ - -#include "sdk_common.h" - -#include -#include "nrf.h" -#include "nrf_drv_gpiote.h" - -#define trig_r NRF_GPIO_PIN_MAP(0,18) -#define trig_r_CONFIG() nrf_gpio_cfg_output(trig_r) -#define trig_SW(x) if(x == true) nrf_gpio_pin_set(trig_r);\ - else if(x == false) nrf_gpio_pin_clear(trig_r) -/* For NIR LED */ - -//#define LIGHT_ON1 NRF_GPIO_PIN_MAP(0,28) -//#define LIGHT_ON2 NRF_GPIO_PIN_MAP(0,29) -//#define LIGHT_ON3 NRF_GPIO_PIN_MAP(0,31) -//#define LIGHT_ON4 NRF_GPIO_PIN_MAP(0,19) -//may work below. -//#define VCSEL_SW1 NRF_GPIO_PIN_MAP(1,1) -//#define VCSEL_SW2 NRF_GPIO_PIN_MAP(1,2) -//#define VCSEL_SW3 NRF_GPIO_PIN_MAP(1,3) - - - -#define LIGHT_ON NRF_GPIO_PIN_MAP(0,22) -#define NIR_PART_SEL NRF_GPIO_PIN_MAP(1,7) - -#define NIRLED_SEL0 NRF_GPIO_PIN_MAP(1,4) -#define NIRLED_SEL1 NRF_GPIO_PIN_MAP(1,5) - -#define NIR_WAV_SEL0 NRF_GPIO_PIN_MAP(1,1) -#define NIR_WAV_SEL1 NRF_GPIO_PIN_MAP(1,2) -#define NIR_WAV_SEL2 NRF_GPIO_PIN_MAP(1,3) - - - -//#define LED_CONFIG() nrf_gpio_cfg(LIGHT_ON1, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_CONNECT,NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_S0D1,NRF_GPIO_PIN_NOSENSE);\ -// nrf_gpio_cfg(LIGHT_ON2, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_CONNECT,NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_S0D1,NRF_GPIO_PIN_NOSENSE);\ -// nrf_gpio_cfg(LED_SEL_SW1, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_CONNECT,NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_S0D1,NRF_GPIO_PIN_NOSENSE);\ -// nrf_gpio_cfg(LED_SEL_SW2, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_CONNECT,NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_S0D1,NRF_GPIO_PIN_NOSENSE);\ -// nrf_gpio_cfg(LED_SEL_SW3, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_CONNECT,NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_S0D1,NRF_GPIO_PIN_NOSENSE);\ -// nrf_gpio_cfg(LED_INDIV_SEL_SW1, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_CONNECT,NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_S0D1,NRF_GPIO_PIN_NOSENSE);\ -// nrf_gpio_cfg(LED_INDIV_SEL_SW2, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_CONNECT,NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_S0D1,NRF_GPIO_PIN_NOSENSE);\ -// nrf_gpio_cfg(LED_INDIV_SEL_SW3, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_CONNECT,NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_S0D1,NRF_GPIO_PIN_NOSENSE); - - - - - - -#define LED_CONFIG()nrf_gpio_cfg_output(LIGHT_ON);\ - nrf_gpio_cfg_output(NIR_PART_SEL);\ - nrf_gpio_cfg_output(NIRLED_SEL0);\ - nrf_gpio_cfg_output(NIRLED_SEL1);\ - nrf_gpio_cfg_output(NIR_WAV_SEL0);\ - nrf_gpio_cfg_output(NIR_WAV_SEL1);\ - nrf_gpio_cfg_output(NIR_WAV_SEL2) - - - - -// Macros for LEDs 0 to 5 ( LIGHT_ON -->0) -#define LED0() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - -#define LED1() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED2() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED3() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED4() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - -#define LED5() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - - - - -// Macros for LEDs 10 to 15 ( LIGHT_ON -->0) -#define LED6() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - -#define LED7() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED8() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED9() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED10() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - -#define LED11() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - - -// Macros for LEDs 20 to 25 ( LIGHT_ON -->0) -#define LED12() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - -#define LED13() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED14() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED15() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED16() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - -#define LED17() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - - -// Macros for LEDs 30 to 35 ( LIGHT_ON -->0) -#define LED18() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - -#define LED19() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED20() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED21() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED22() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - -#define LED23() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - - - - - -// Macros for LEDs 40 to 45 ( LIGHT_ON -->0) -#define LED24() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - -#define LED25() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED26() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED27() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED28() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - -#define LED29() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - - - -// Macros for LEDs 50 to 55 ( LIGHT_ON -->0) -#define LED30() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - -#define LED31() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED32() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED33() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED34() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - -#define LED35() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_clear(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - - - -// Macros for LEDs 60 to 65 ( LIGHT_ON -->0) -#define LED36() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - -#define LED37() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED38() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED39() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED40() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - -#define LED41() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_clear(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - - - - - -// Macros for LEDs 70 to 75 ( LIGHT_ON -->0) -#define LED42() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - -#define LED43() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED44() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED45() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL2) - - -#define LED46() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_clear(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - -#define LED47() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_set(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_clear(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - - - -#define LED_ALLOFF() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - - - -#define LED99() nrf_gpio_pin_clear(LIGHT_ON); \ - nrf_gpio_pin_clear(NIR_PART_SEL); \ - nrf_gpio_pin_set(NIRLED_SEL0); \ - nrf_gpio_pin_set(NIRLED_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL0); \ - nrf_gpio_pin_set(NIR_WAV_SEL1); \ - nrf_gpio_pin_set(NIR_WAV_SEL2) - - -/* -#define LED23() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_clear(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - -#define LED24() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_clear(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - - - -#define LED_ALLOFF() nrf_gpio_pin_clear(LIGHT_ON1);\ - nrf_gpio_pin_clear(LIGHT_ON2);\ - nrf_gpio_pin_clear(LIGHT_ON3);\ - nrf_gpio_pin_clear(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_set(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) -*/ - - - - - - -/* For Photo Diode */ - -//#define MUX_EN_RDATA1 NRF_GPIO_PIN_MAP(1,6) -//#define MUX_EN_RDATA2 NRF_GPIO_PIN_MAP(1,5) -//#define MUX_EN_RDATA3 NRF_GPIO_PIN_MAP(1,4) -// -//#define RDATA_SW1 NRF_GPIO_PIN_MAP(0,23) -//#define RDATA_SW2 NRF_GPIO_PIN_MAP(0,22) -//#define RDATA_SW3 NRF_GPIO_PIN_MAP(0,21) - -#define PD_SEL0 NRF_GPIO_PIN_MAP(1,12) -#define PD_SEL1 NRF_GPIO_PIN_MAP(1,11) -//#define PD_SEL3 NRF_GPIO_PIN_MAP(1,10) no use - -#define PD_CONFIG() nrf_gpio_cfg_output(PD_SEL0);\ - nrf_gpio_cfg_output(PD_SEL1) - -#define PD0() nrf_gpio_pin_clear(PD_SEL0);\ - nrf_gpio_pin_clear(PD_SEL1) - -#define PD1() nrf_gpio_pin_set(PD_SEL0);\ - nrf_gpio_pin_clear(PD_SEL1) - -#define MOD() nrf_gpio_pin_clear(PD_SEL0);\ - nrf_gpio_pin_set(PD_SEL1) -#define MOD2() nrf_gpio_pin_set(PD_SEL0);\ - nrf_gpio_pin_set(PD_SEL1) -/* -#define PD4() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD5() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_set(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - - - - -#define PD_ALLOFF() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_clear(MUX_EN_RDATA2);\ - nrf_gpio_pin_clear(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_set(PD_SEL1);\ - nrf_gpio_pin_set(PD_SEL2);\ - nrf_gpio_pin_set(PD_SEL3) -*/ -#define PD_ALLOFF() nrf_gpio_pin_set(PD_SEL0);\ - nrf_gpio_pin_set(PD_SEL1) - - -/* For IC_NZP */ // No USE for 3.0 -//#define VCSEL_EN_PIN NRF_GPIO_PIN_MAP(1,7) -//#define VCSEL_CONFIG() nrf_gpio_cfg_output(VCSEL_EN_PIN) -//#define VCSEL_SW(x) if(x == true) nrf_gpio_pin_set(VCSEL_EN_PIN);\ -// else if(x == false) nrf_gpio_pin_clear(VCSEL_EN_PIN) - - -/* For AGC SW FSA5157L6X */ -#define GAIN_SW_PIN NRF_GPIO_PIN_MAP(0,20) -#define GAIN_SW_CONFIG() nrf_gpio_cfg_output(GAIN_SW_PIN) -#define AGC_GAIN_SW(x) if(x == true) nrf_gpio_pin_set(GAIN_SW_PIN);\ - else if(x == false) nrf_gpio_pin_clear(GAIN_SW_PIN) - - - - -void led_pd_gain_array_printout(void); -ret_code_t led_on(uint8_t led_index); -ret_code_t led_off(uint8_t led_index); -ret_code_t led_pd_matching_value_set(uint8_t led_index); - - - -ret_code_t led_pd_mod_set(uint16_t mod_gain); -ret_code_t pd_on(uint8_t pd_index); -ret_code_t pd_off(uint8_t pd_index); -int16_t led_power_read(uint8_t led_index); -void led_power_read_48(uint16_t *data); -ret_code_t led_power_save_mem(uint8_t led_index, int16_t led_power); -ret_code_t led_power_save_mem_6(uint8_t led_index, int16_t led_power); -ret_code_t led_power_save_mem_48( uint8_t *led_power); -ret_code_t led_power_set(uint8_t led_index); -ret_code_t pd_gain_set(uint8_t activated_led); //version B change 2025.04.27 -ret_code_t imm_gain_set(uint16_t imm_dac); //version B add 2025.05.07 -ret_code_t led_select(uint8_t led_index); -ret_code_t pd_select(uint8_t pd_index); -void led_power_span(uint8_t led_index); -void mea_send_loop(void * p_context); /* For x ms */ -void mea_send_timer_start(void); -void mea_send_timer_stop(void); -void mea_send_timer_init(void); -#endif //_MEASUREMENTS_H__ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/measurements_20.c b/project/ble_peripheral/ble_app_bladder_patch/measurements_20.c deleted file mode 100644 index 597a8fc..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/measurements_20.c +++ /dev/null @@ -1,657 +0,0 @@ -/******************************************************************************* - * @file measurements.c - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#include "sdk_common.h" - -#include -#include -#include -#include -#include "nrf.h" -#include "nrf_drv_gpiote.h" -#include "nrf_drv_spi.h" -#include "nrf_drv_saadc.h" -#include "nrf_drv_ppi.h" -#include "nrf_drv_timer.h" -#include "boards.h" -#include "bsp.h" -#include "app_error.h" -#include "nrf_delay.h" -#include "app_util_platform.h" -#include "nrf_pwr_mgmt.h" - -#include "nrf_log.h" - -#include "ble_nus.h" -#include "app_timer.h" -#include "measurements.h" -#include "main.h" -#include "fstorage.h" -#include "ad5272_i2c.h" -#include "mcp4725_i2c.h" - - -uint8_t activated_led = 99; -uint8_t activated_pd = 99; -APP_TIMER_DEF(m_mea_send_loop_timer_id); -static uint8_t cnt =0; -#define MEA_SEND_LOOP_INTERVAL 100 -char mea_tx_buffer[BLE_NUS_MAX_DATA_LEN]; -extern volatile bool processing; -/* Default Value before initialized. Set value for Default!!! */ /* 초기값 설정 */ -/* 0번은 사용하지 않음 = NULL, 1 ~ 24까지 사용 */ -/*AD5272 DP에 쓸수 있는 값 범위는 0 ~ 1023 */ -//uint16_t led_power_dp[LED_NUM] = { -// //NULL, 42, 29, 41, 31, 28, 28, 42, 28, 39, 29, 27, 27, 42, 29, 40, 30, 28, 28, 40, 27, 38, 28, 25, 22 -// 0,25,25,18,19,24,24,25,25,18,19,25,23,25,25,18,19,24,24,25,25,19,20,25,24 -//}; - -/*LED0 = NULL 사용하지 않음, LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8, LED9, LED10, LED11, LED12, LED13, LED14, LED15, LED16, LED17, LED18, LED19, LED20, LED21, LED22, LED23, LED24 */ -/*MCP4725 를 0.1V(125) ~ 1.1V(1366) 값을 사용 */ -//uint16_t led_pd_dac_v[PD_NUM][LED_NUM] = { -// {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}, /*PD0 사용 않음 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD1 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD2 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD3 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD4 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD5 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD6 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD7 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD8 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD9 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD10 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD11 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD12 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD13 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD14 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD15 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD16 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD17 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD18 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD19 */ -// {NULL, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* PD20 */ -//}; - - - - - - -void led_pd_gain_array_printout(void) -{ -// printf("\r\nLED-DP Gain Array =\r\n"); -// for(uint16_t i = 0; i < LED_NUM; i++){ -// printf("%d,\t", led_power_dp[i]); -// } -// printf("\r\n"); - -// printf("\r\nLED-PD Gain Array =\r\n"); -// for(uint16_t i = 0; i < PD_NUM; i++){ -// for(uint16_t j = 0; j < LED_NUM; j++){ -// printf("%d,\t", led_pd_dac_v[i][j]); -// } -// break; -// printf("\r\n"); -// } -// printf("\r\n"); -// nrf_delay_ms(5); - cnt=0; - - mea_send_timer_start(); -} - - -void mea_send_loop(void * p_context) /* For x ms */ -{ - - - UNUSED_PARAMETER(p_context); - printf("\r\n1CNT =%d\r\n",cnt); - mea_send_timer_stop(); - - - if (cnt < 21) - { - uint8_t i = cnt; - sprintf(mea_tx_buffer, "Tag-Currrnt %d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", i, m_config.led_pd_dac_v[i][0], m_config.led_pd_dac_v[i][1], m_config.led_pd_dac_v[i][2], m_config.led_pd_dac_v[i][3], m_config.led_pd_dac_v[i][4], m_config.led_pd_dac_v[i][5], m_config.led_pd_dac_v[i][6], m_config.led_pd_dac_v[i][7],m_config.led_pd_dac_v[i][8], m_config.led_pd_dac_v[i][9], m_config.led_pd_dac_v[i][10], - m_config.led_pd_dac_v[i][11], m_config.led_pd_dac_v[i][12], m_config.led_pd_dac_v[i][13], m_config.led_pd_dac_v[i][14], m_config.led_pd_dac_v[i][15], m_config.led_pd_dac_v[i][16], m_config.led_pd_dac_v[i][17],m_config.led_pd_dac_v[i][18], m_config.led_pd_dac_v[i][19], m_config.led_pd_dac_v[i][20], m_config.led_pd_dac_v[i][21],m_config.led_pd_dac_v[i][22], m_config.led_pd_dac_v[i][23], m_config.led_pd_dac_v[i][24]); - data_tx_handler(mea_tx_buffer); - printf("\r\n2CNT =%d\r\n",cnt); - - mea_send_timer_start(); - -// switch(cnt){ -// case 0: -// break; -// case 1: -// sprintf(mea_tx_buffer, "Tag-Currrnt %d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", i, 0,m_config.led_pd_dac_v_led_1[1], m_config.led_pd_dac_v_led_2[1], m_config.led_pd_dac_v_led_3[1], m_config.led_pd_dac_v_led_4[1], m_config.led_pd_dac_v_led_5[1], m_config.led_pd_dac_v_led_6[1], m_config.led_pd_dac_v_led_7[1], m_config.led_pd_dac_v_led_8[1], -// m_config.led_pd_dac_v_led_9[1], m_config.led_pd_dac_v_led_10[1], m_config.led_pd_dac_v_led_11[1], m_config.led_pd_dac_v_led_12[1], m_config.led_pd_dac_v_led_13[1], m_config.led_pd_dac_v_led_14[1], m_config.led_pd_dac_v_led_15[1], m_config.led_pd_dac_v_led_16[1], m_config.led_pd_dac_v_led_17[1],m_config.led_pd_dac_v_led_18[1], -// m_config.led_pd_dac_v_led_19[1], m_config.led_pd_dac_v_led_20[1],m_config.led_pd_dac_v_led_21[1], m_config.led_pd_dac_v_led_22[1],m_config.led_pd_dac_v_led_23[1], m_config.led_pd_dac_v_led_24[1]); -// break; -// case 2: -// sprintf(mea_tx_buffer, "Tag-Currrnt %d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", i, 0, m_config.led_pd_dac_v_led_1[1], m_config.led_pd_dac_v_led_2[1], m_config.led_pd_dac_v_led_3[1], m_config.led_pd_dac_v_led_4[1], m_config.led_pd_dac_v_led_5[1], m_config.led_pd_dac_v_led_6[1], m_config.led_pd_dac_v_led_7[1], m_config.led_pd_dac_v_led_8[1], -// m_config.led_pd_dac_v_led_9[1], m_config.led_pd_dac_v_led_10[1], m_config.led_pd_dac_v_led_11[1], m_config.led_pd_dac_v_led_12[1], m_config.led_pd_dac_v_led_13[1], m_config.led_pd_dac_v_led_14[1], m_config.led_pd_dac_v_led_15[1], m_config.led_pd_dac_v_led_16[1], m_config.led_pd_dac_v_led_17[1],m_config.led_pd_dac_v_led_18[1], -// m_config.led_pd_dac_v_led_19[1], m_config.led_pd_dac_v_led_20[1],m_config.led_pd_dac_v_led_21[1], m_config.led_pd_dac_v_led_22[1],m_config.led_pd_dac_v_led_23[1], m_config.led_pd_dac_v_led_24[1]); -// break; -// case 3: -// sprintf(mea_tx_buffer, "Tag-Currrnt %d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d,\t%d\r\n", i,0, m_config.led_pd_dac_v_led_1[1], m_config.led_pd_dac_v_led_2[1], m_config.led_pd_dac_v_led_3[1], m_config.led_pd_dac_v_led_4[1], m_config.led_pd_dac_v_led_5[1], m_config.led_pd_dac_v_led_6[1], m_config.led_pd_dac_v_led_7[1], m_config.led_pd_dac_v_led_8[1], -// m_config.led_pd_dac_v_led_9[1], m_config.led_pd_dac_v_led_10[1], m_config.led_pd_dac_v_led_11[1], m_config.led_pd_dac_v_led_12[1], m_config.led_pd_dac_v_led_13[1], m_config.led_pd_dac_v_led_14[1], m_config.led_pd_dac_v_led_15[1], m_config.led_pd_dac_v_led_16[1], m_config.led_pd_dac_v_led_17[1],m_config.led_pd_dac_v_led_18[1], -// m_config.led_pd_dac_v_led_19[1], m_config.led_pd_dac_v_led_20[1],m_config.led_pd_dac_v_led_21[1], m_config.led_pd_dac_v_led_22[1],m_config.led_pd_dac_v_led_23[1], m_config.led_pd_dac_v_led_24[1]); -// break; -// default: -// break; -//// } - -// sprintf(mea_tx_buffer,"CNT_%d\r\n",cnt); -// data_tx_handler(mea_tx_buffer); -// -// mea_send_timer_start(); - - } - else - { - //battery_timer_start(); - sprintf(mea_tx_buffer,"END \r\n"); - data_tx_handler(mea_tx_buffer); - printf("\r\nLED-DP Gain Array =\r\n"); - for(uint16_t i = 0; i < LED_NUM; i++){ - printf("%d,\t", m_config.led_power_dp[i]); - } - printf("\r\n"); - - printf("\r\nLED-PD Gain Array =\r\n"); - for(uint16_t i = 0; i < PD_NUM; i++){ - for(uint16_t j = 0; j < LED_NUM; j++){ - printf("%d,\t", m_config.led_pd_dac_v[i][j]); - } - ///break; - printf("\r\n"); - } - printf("\r\n"); - processing = false ; - } - - cnt++; - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -ret_code_t led_on(uint8_t led_index) -{ - uint32_t err_code = NRF_SUCCESS; - -#if FEATURE_PRINTF - printf("\tled_on, %d =====================\r\n", led_index); -#endif - - if((led_index >= 1)&&(led_index <= 24)){ - - activated_led = led_index; - - /* LED켤때 파워 셋팅한후 켜는지 결정요 */ - if(NRF_SUCCESS != led_power_set(led_index)) { - printf("ERR!!! LED Power set\r\n"); - return NRF_ERROR_INTERNAL; - } - -#if FEATURE_FOR_SCOPE - nrf_gpio_pin_set(LED_CLK_15); - nrf_gpio_pin_clear(LED_CLK_15); -#endif - - if(NRF_SUCCESS != led_select(led_index)){ - printf("ERR!!! LED Select\r\n"); - return NRF_ERROR_INTERNAL; - } - - VCSEL_SW(true); - - }else{ - printf("ERR!!! led_index Failed! %d\r\n", led_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -ret_code_t led_off(uint8_t led_index) -{ - uint32_t err_code = NRF_SUCCESS; - -#if FEATURE_PRINTF - printf("led_off\r\n"); -#endif - - if(led_index == 99){ - LED_ALLOFF(); - VCSEL_SW(false); - - activated_led = 99; - }else{ - printf("ERR!!! led_index Failed! %d\r\n", led_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -ret_code_t led_pd_matching_value_set(uint8_t led_index, uint8_t pd_index) -{ - uint32_t err_code = NRF_SUCCESS; - - if(((led_index >= 1)&&(led_index <= 24))||((pd_index >= 1)&&(pd_index <= 20))){ - - if(NRF_SUCCESS != pd_gain_set(led_index, pd_index)){ - printf("ERR!!! pd_gain_set\r\n"); - return NRF_ERROR_INTERNAL; - } - - if(NRF_SUCCESS != pd_on(pd_index)){ - printf("ERR!!! pd_on\r\n"); - return NRF_ERROR_INTERNAL; - } - - }else{ - printf("ERR!!! led_index || pd_index Failed! %d, %d\r\n", led_index, pd_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -ret_code_t pd_on(uint8_t pd_index) -{ - uint32_t err_code = NRF_SUCCESS; -#if FEATURE_FOR_SCOPE - nrf_gpio_pin_set(PD_CLK_26); - nrf_gpio_pin_clear(PD_CLK_26); -#endif - -#if FEATURE_PRINTF - printf("pd_on, %d ===== \r\n", pd_index); -#endif - - if((pd_index >= 1)&&(pd_index <= 20)){ - - activated_pd = pd_index; - - if(NRF_SUCCESS != pd_select(pd_index)){ - printf("ERR!!! pd_on Failed! %d\r\n", pd_index); - return NRF_ERROR_INTERNAL; - } - - }else{ - printf("ERR!!! pd_index Failed! %d\r\n", pd_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -ret_code_t pd_off(uint8_t pd_index) -{ - uint32_t err_code = NRF_SUCCESS; - -#if FEATURE_PRINTF - printf("pd_off\r\n"); -#endif - - if(pd_index == 99){ - PD_ALLOFF(); - activated_pd = 99; - }else{ - printf("ERR!!! PD Off Failed! %d\r\n", pd_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -int16_t led_power_read(uint8_t led_index) -{ - int16_t led_power; - - if((led_index >= 1)&&(led_index <= 24)){ - led_power = m_config.led_power_dp[led_index]; - }else{ - printf("ERR!!! led_index Failed! %d\r\n", led_index); - return NRF_ERROR_INTERNAL; - } - - return led_power; -} - - -ret_code_t led_power_save_mem(uint8_t led_index, int16_t led_power) /* 커맨드에 의해서 LED파워 값을 저장할때 */ -{ - uint32_t err_code = NRF_SUCCESS; - - if(((led_index >= 1)&&(led_index <= 24))||((led_power >= 0)&&(led_power <= 1023))){ - m_config.led_power_dp[led_index] = led_power; - - if(activated_led == led_index) { /* LED파워 값을 RDAC에도 설정함. */ - if(NRF_SUCCESS != ad5272_write_rdac(led_power)){ - printf("ERR!!! ad5272_write_rdac 1\r\n"); - err_code = NRF_ERROR_INTERNAL; - } - } - - }else{ - printf("ERR!!! led_index || pd_index Failed! %d, %d\r\n", led_index, led_power); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -ret_code_t led_power_set(uint8_t led_index) /* LED켤때 사용, 메모리 값을 디지털포텐셔미터에 입력 */ -{ - uint32_t err_code = NRF_SUCCESS; - int16_t led_power; - - if((led_index >= 1)&&(led_index <= 24)){ - - led_power = m_config.led_power_dp[led_index]; - - if(NRF_SUCCESS != ad5272_write_rdac(led_power)) { /* LED를 켜기전에 메모리에 저장된 파워값을 DAC에 설정 */ - printf("ERR!!! ad5272_write_rdac 2\r\n"); - err_code = NRF_ERROR_INTERNAL; - } - - }else{ - printf("ERR!!! led_index Failed! %d\r\n", led_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -ret_code_t pd_gain_set(uint8_t activated_led, uint8_t pd_index) /* LED와 PD 매칭 값으로 On */ -{ - uint32_t err_code = NRF_SUCCESS; - -#if FEATURE_PRINTF - printf("<>\r\n",activated_led ,pd_index); -#endif - - if(((activated_led >= 1)&&(activated_led <= 24))||((pd_index >= 1)&&(pd_index <= 20))){ - mcp4725_writeFastMode( m_config.led_pd_dac_v[pd_index][activated_led]); /* LED는 먼저 ON되어 있어 하며 그 LED번호와 PD배칭 값으로 DAC에 설정 */ - - }else{ - printf("ERR!!! led_index || pd_index Failed! %d, %d\r\n", activated_led, pd_index); - return NRF_ERROR_INTERNAL; - } - - return err_code; -} - - -ret_code_t led_select(uint8_t led_index) -{ - uint32_t err_code = NRF_SUCCESS; - - LED_ALLOFF(); - VCSEL_SW(false); - - switch(led_index) { - case 1: - LED1(); - break; - - case 2: - LED2(); - break; - - case 3: - LED3(); - break; - - case 4: - LED4(); - break; - - case 5: - LED5(); - break; - - case 6: - LED6(); - break; - - case 7: - LED7(); - break; - - case 8: - LED8(); - break; - - case 9: - LED9(); - break; - - case 10: - LED10(); - break; - - case 11: - LED11(); - break; - - case 12: - LED12(); - break; - - case 13: - LED13(); - break; - - case 14: - LED14(); - break; - - case 15: - LED15(); - break; - - case 16: - LED16(); - break; - - case 17: - LED17(); - break; - - case 18: - LED18(); - break; - - case 19: - LED19(); - break; - - case 20: - LED20(); - break; - - case 21: - LED21(); - break; - - case 22: - LED22(); - break; - - case 23: - LED23(); - break; - - case 24: - LED24(); - break; - - default: - err_code = NRF_ERROR_NOT_FOUND; - break; - } - - return err_code; -} - - -ret_code_t pd_select(uint8_t pd_index) -{ - uint32_t err_code = NRF_SUCCESS; - - PD_ALLOFF(); - - switch(pd_index) { - case 1: - PD1(); - break; - - case 2: - PD2(); - break; - - case 3: - PD3(); - break; - - case 4: - PD4(); - break; - - case 5: - PD5(); - break; - - case 6: - PD6(); - break; - - case 7: - PD7(); - break; - - case 8: - PD8(); - break; - - case 9: - PD9(); - break; - - case 10: - PD10(); - break; - - case 11: - PD11(); - break; - - case 12: - PD12(); - break; - - case 13: - PD13(); - break; - - case 14: - PD14(); - break; - - case 15: - PD15(); - break; - - case 16: - PD16(); - break; - - case 17: - PD17(); - break; - - case 18: - PD18(); - break; - - case 19: - PD19(); - break; - - case 20: - PD20(); - break; - - default: - err_code = NRF_ERROR_NOT_FOUND; - break; - } - - return err_code; -} - - -void mea_send_timer_start(void) -{ - APP_ERROR_CHECK(app_timer_start(m_mea_send_loop_timer_id, APP_TIMER_TICKS(MEA_SEND_LOOP_INTERVAL), NULL)); -} - - -void mea_send_timer_stop(void) -{ - APP_ERROR_CHECK(app_timer_stop(m_mea_send_loop_timer_id)); - -} - - -void mea_send_timer_init(void) -{ - APP_ERROR_CHECK(app_timer_create(&m_mea_send_loop_timer_id, APP_TIMER_MODE_SINGLE_SHOT, mea_send_loop)); -} - diff --git a/project/ble_peripheral/ble_app_bladder_patch/measurements_20.h b/project/ble_peripheral/ble_app_bladder_patch/measurements_20.h deleted file mode 100644 index 2493288..0000000 --- a/project/ble_peripheral/ble_app_bladder_patch/measurements_20.h +++ /dev/null @@ -1,519 +0,0 @@ -/******************************************************************************* - * @file measurements.h - * @author CandyPops Co. - * @version V1.0.0 - * @date 2022-09-05 - * @brief - ******************************************************************************/ - -#ifndef _MEASUREMENTS_H__ -#define _MEASUREMENTS_H__ - -#include "sdk_common.h" - -#include -#include "nrf.h" -#include "nrf_drv_gpiote.h" - - -/* For NIR LED */ - -#define LIGHT_ON1 NRF_GPIO_PIN_MAP(0,28) -#define LIGHT_ON2 NRF_GPIO_PIN_MAP(0,29) -#define LIGHT_ON3 NRF_GPIO_PIN_MAP(0,31) -#define LIGHT_ON4 NRF_GPIO_PIN_MAP(0,19) - -#define VCSEL_SW1 NRF_GPIO_PIN_MAP(1,1) -#define VCSEL_SW2 NRF_GPIO_PIN_MAP(1,2) -#define VCSEL_SW3 NRF_GPIO_PIN_MAP(1,3) - -#define LED_CONFIG() nrf_gpio_cfg_output(LIGHT_ON1);\ - nrf_gpio_cfg_output(LIGHT_ON2);\ - nrf_gpio_cfg_output(LIGHT_ON3);\ - nrf_gpio_cfg_output(LIGHT_ON4);\ - nrf_gpio_cfg_output(VCSEL_SW1);\ - nrf_gpio_cfg_output(VCSEL_SW2);\ - nrf_gpio_cfg_output(VCSEL_SW3) - -#define LED1() nrf_gpio_pin_clear(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED2() nrf_gpio_pin_clear(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED3() nrf_gpio_pin_clear(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_set(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED4() nrf_gpio_pin_clear(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_set(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED5() nrf_gpio_pin_clear(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - -#define LED6() nrf_gpio_pin_clear(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - - - -#define LED7() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_clear(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED8() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_clear(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED9() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_clear(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_set(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED10() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_clear(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_set(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED11() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_clear(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - -#define LED12() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_clear(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - - -#define LED13() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_clear(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED14() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_clear(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED15() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_clear(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_set(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED16() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_clear(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_set(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED17() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_clear(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - -#define LED18() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_clear(LIGHT_ON3);\ - nrf_gpio_pin_set(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - - -#define LED19() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_clear(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED20() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_clear(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED21() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_clear(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_set(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED22() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_clear(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_set(VCSEL_SW2);\ - nrf_gpio_pin_clear(VCSEL_SW3) - -#define LED23() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_clear(LIGHT_ON4);\ - nrf_gpio_pin_clear(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - -#define LED24() nrf_gpio_pin_set(LIGHT_ON1);\ - nrf_gpio_pin_set(LIGHT_ON2);\ - nrf_gpio_pin_set(LIGHT_ON3);\ - nrf_gpio_pin_clear(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_clear(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - - - -#define LED_ALLOFF() nrf_gpio_pin_clear(LIGHT_ON1);\ - nrf_gpio_pin_clear(LIGHT_ON2);\ - nrf_gpio_pin_clear(LIGHT_ON3);\ - nrf_gpio_pin_clear(LIGHT_ON4);\ - nrf_gpio_pin_set(VCSEL_SW1);\ - nrf_gpio_pin_set(VCSEL_SW2);\ - nrf_gpio_pin_set(VCSEL_SW3) - - -/* For Photo Diode */ - -#define MUX_EN_RDATA1 NRF_GPIO_PIN_MAP(1,6) -#define MUX_EN_RDATA2 NRF_GPIO_PIN_MAP(1,5) -#define MUX_EN_RDATA3 NRF_GPIO_PIN_MAP(1,4) - -#define RDATA_SW1 NRF_GPIO_PIN_MAP(0,23) -#define RDATA_SW2 NRF_GPIO_PIN_MAP(0,22) -#define RDATA_SW3 NRF_GPIO_PIN_MAP(0,21) - -#define PD_SEL1 NRF_GPIO_PIN_MAP(1,12) -#define PD_SEL2 NRF_GPIO_PIN_MAP(1,11) -#define PD_SEL3 NRF_GPIO_PIN_MAP(1,10) - -#define PD_CONFIG() nrf_gpio_cfg_output(MUX_EN_RDATA1);\ - nrf_gpio_cfg_output(MUX_EN_RDATA2);\ - nrf_gpio_cfg_output(MUX_EN_RDATA3);\ - nrf_gpio_cfg_output(RDATA_SW1);\ - nrf_gpio_cfg_output(RDATA_SW2);\ - nrf_gpio_cfg_output(RDATA_SW3);\ - nrf_gpio_cfg_output(PD_SEL1);\ - nrf_gpio_cfg_output(PD_SEL2);\ - nrf_gpio_cfg_output(PD_SEL3) - -#define PD1() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD2() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD3() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD4() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD5() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_set(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD6() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_set(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD7() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_set(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD8() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_set(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD9() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_clear(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_set(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD10() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_clear(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_set(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD11() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_clear(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_set(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD12() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_clear(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_set(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD13() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_clear(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_set(RDATA_SW3);\ - nrf_gpio_pin_set(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD14() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_clear(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_set(RDATA_SW3);\ - nrf_gpio_pin_set(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD15() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_clear(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_set(RDATA_SW3);\ - nrf_gpio_pin_set(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD16() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_clear(MUX_EN_RDATA2);\ - nrf_gpio_pin_set(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_set(RDATA_SW3);\ - nrf_gpio_pin_set(PD_SEL1);\ - nrf_gpio_pin_clear(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD17() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_clear(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_set(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD18() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_clear(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_set(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD19() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_clear(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_set(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - -#define PD20() nrf_gpio_pin_set(MUX_EN_RDATA1);\ - nrf_gpio_pin_set(MUX_EN_RDATA2);\ - nrf_gpio_pin_clear(MUX_EN_RDATA3);\ - nrf_gpio_pin_set(RDATA_SW1);\ - nrf_gpio_pin_set(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_clear(PD_SEL1);\ - nrf_gpio_pin_set(PD_SEL2);\ - nrf_gpio_pin_clear(PD_SEL3) - - -#define PD_ALLOFF() nrf_gpio_pin_clear(MUX_EN_RDATA1);\ - nrf_gpio_pin_clear(MUX_EN_RDATA2);\ - nrf_gpio_pin_clear(MUX_EN_RDATA3);\ - nrf_gpio_pin_clear(RDATA_SW1);\ - nrf_gpio_pin_clear(RDATA_SW2);\ - nrf_gpio_pin_clear(RDATA_SW3);\ - nrf_gpio_pin_set(PD_SEL1);\ - nrf_gpio_pin_set(PD_SEL2);\ - nrf_gpio_pin_set(PD_SEL3) - - -/* For IC_NZP */ -#define VCSEL_EN_PIN NRF_GPIO_PIN_MAP(1,7) -#define VCSEL_CONFIG() nrf_gpio_cfg_output(VCSEL_EN_PIN) -#define VCSEL_SW(x) if(x == true) nrf_gpio_pin_set(VCSEL_EN_PIN);\ - else if(x == false) nrf_gpio_pin_clear(VCSEL_EN_PIN) - - -/* For AGC SW FSA5157L6X */ -#define GAIN_SW_PIN NRF_GPIO_PIN_MAP(0,20) -#define GAIN_SW_CONFIG() nrf_gpio_cfg_output(GAIN_SW_PIN) -#define AGC_GAIN_SW(x) if(x == true) nrf_gpio_pin_set(GAIN_SW_PIN);\ - else if(x == false) nrf_gpio_pin_clear(GAIN_SW_PIN) - -#if FEATURE_FOR_SCOPE -#define ADC_CLK_18 18 -#define PD_CLK_26 26 -#define LED_CLK_15 15 -#endif - - -void led_pd_gain_array_printout(void); -ret_code_t led_on(uint8_t led_index); -ret_code_t led_off(uint8_t led_index); -ret_code_t led_pd_matching_value_set(uint8_t led_index, uint8_t pd_index); -ret_code_t pd_on(uint8_t pd_index); -ret_code_t pd_off(uint8_t pd_index); -int16_t led_power_read(uint8_t led_index); -ret_code_t led_power_save_mem(uint8_t led_index, int16_t led_power); -ret_code_t led_power_set(uint8_t led_index); -ret_code_t pd_gain_set(uint8_t activated_led, uint8_t pd_index); -ret_code_t led_select(uint8_t led_index); -ret_code_t pd_select(uint8_t pd_index); -void mea_send_loop(void * p_context); /* For x ms */ -void mea_send_timer_start(void); -void mea_send_timer_stop(void); -void mea_send_timer_init(void); - -#endif //_MEASUREMENTS_H__ - diff --git a/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/arm5_no_packs/ble_app_bladder_patch_s140.uvoptx b/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/arm5_no_packs/ble_app_bladder_patch_s140.uvoptx index f16766c..26232f3 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/arm5_no_packs/ble_app_bladder_patch_s140.uvoptx +++ b/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/arm5_no_packs/ble_app_bladder_patch_s140.uvoptx @@ -161,7 +161,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -177,7 +177,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -257,7 +257,7 @@ 0 0 0 - ..\..\..\cat_interface.c + C:\jhChun\VesiScan-Basic_0313\VesiScan-Basic\project\ble_peripheral\ble_app_bladder_patch\cat_interface.c @@ -273,7 +273,7 @@ 0 0 0 - ..\..\..\measurements.c + C:\jhChun\VesiScan-Basic_0312\VesiScan-Basic\project\ble_peripheral\ble_app_bladder_patch\measurements.c @@ -289,7 +289,7 @@ 0 0 0 - ..\..\..\measurements.c + C:\jhChun\VesiScan-Basic_0312\VesiScan-Basic\project\ble_peripheral\ble_app_bladder_patch\measurements.c @@ -337,7 +337,7 @@ 0 0 0 - ..\..\..\measurements.c + C:\jhChun\VesiScan-Basic_0312\VesiScan-Basic\project\ble_peripheral\ble_app_bladder_patch\measurements.c @@ -353,7 +353,7 @@ 0 0 0 - ..\..\..\measurements.c + C:\jhChun\VesiScan-Basic_0312\VesiScan-Basic\project\ble_peripheral\ble_app_bladder_patch\measurements.c @@ -561,7 +561,7 @@ 0 0 0 - ..\..\..\measurements.c + C:\jhChun\VesiScan-Basic_0312\VesiScan-Basic\project\ble_peripheral\ble_app_bladder_patch\measurements.c @@ -577,7 +577,7 @@ 0 0 0 - ..\..\..\measurements.c + C:\jhChun\VesiScan-Basic_0312\VesiScan-Basic\project\ble_peripheral\ble_app_bladder_patch\measurements.c @@ -609,7 +609,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -625,7 +625,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -641,7 +641,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -657,7 +657,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -673,7 +673,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -689,7 +689,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -785,7 +785,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -801,7 +801,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -817,7 +817,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -833,7 +833,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -849,7 +849,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -865,7 +865,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + C:\jhChun\VesiScan-Basic\pc_firm\parser.c @@ -881,7 +881,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\dr_adc121s051\dr_adc121s051.c + C:\jhChun\VesiScan-Basic\pc_firm\dr_adc121s051\dr_adc121s051.c @@ -897,7 +897,7 @@ 0 0 0 - ..\..\..\..\..\..\..\pc_firm\dr_adc121s051\dr_adc121s051.c + C:\jhChun\VesiScan-Basic\pc_firm\dr_adc121s051\dr_adc121s051.c @@ -1163,30 +1163,6 @@ 0 0 0 - ..\..\..\ada2200_spi.c - ada2200_spi.c - 0 - 0 - - - 1 - 5 - 1 - 0 - 0 - 0 - ..\..\..\ad5272_i2c.c - ad5272_i2c.c - 0 - 0 - - - 1 - 6 - 1 - 0 - 0 - 0 ..\..\..\battery_saadc.c battery_saadc.c 0 @@ -1194,19 +1170,7 @@ 1 - 7 - 1 - 0 - 0 - 0 - ..\..\..\mcp4725_i2c.c - mcp4725_i2c.c - 0 - 0 - - - 1 - 8 + 5 1 0 0 @@ -1218,7 +1182,7 @@ 1 - 9 + 6 1 0 0 @@ -1230,19 +1194,7 @@ 1 - 10 - 1 - 0 - 0 - 0 - ..\..\..\measurements.c - measurements.c - 0 - 0 - - - 1 - 11 + 7 1 0 0 @@ -1254,91 +1206,7 @@ 1 - 12 - 1 - 0 - 0 - 0 - ..\..\..\mcp4725_adc.c - mcp4725_adc.c - 0 - 0 - - - 1 - 13 - 1 - 0 - 0 - 0 - ..\..\..\meas_pd_voltage_simple.c - meas_pd_voltage_simple.c - 0 - 0 - - - 1 - 14 - 1 - 0 - 0 - 0 - ..\..\..\full_agc.c - full_agc.c - 0 - 0 - - - 1 - 15 - 1 - 0 - 0 - 0 - ..\..\..\ir_i2c.c - ir_i2c.c - 0 - 0 - - - 1 - 16 - 1 - 0 - 0 - 0 - ..\..\..\LED_Parse.c - LED_Parse.c - 0 - 0 - - - 1 - 17 - 1 - 0 - 0 - 0 - ..\..\..\cat_interface.c - cat_interface.c - 0 - 0 - - - 1 - 18 - 5 - 0 - 0 - 0 - ..\..\..\cat_interface.h - cat_interface.h - 0 - 0 - - - 1 - 19 + 8 1 0 0 @@ -1350,7 +1218,7 @@ 1 - 20 + 9 5 0 0 @@ -1362,55 +1230,7 @@ 1 - 21 - 5 - 0 - 0 - 0 - ..\..\..\meas_pd_imm.h - meas_pd_imm.h - 0 - 0 - - - 1 - 22 - 1 - 0 - 0 - 0 - ..\..\..\meas_pd_imm.c - meas_pd_imm.c - 0 - 0 - - - 1 - 23 - 1 - 0 - 0 - 0 - ..\..\..\meas_pd_48.c - meas_pd_48.c - 0 - 0 - - - 1 - 24 - 5 - 0 - 0 - 0 - ..\..\..\meas_pd_48.h - meas_pd_48.h - 0 - 0 - - - 1 - 25 + 10 5 0 0 @@ -1422,7 +1242,7 @@ 1 - 26 + 11 1 0 0 @@ -1434,7 +1254,7 @@ 1 - 27 + 12 5 0 0 @@ -1446,7 +1266,7 @@ 1 - 28 + 13 1 0 0 @@ -1458,57 +1278,57 @@ 1 - 29 + 14 5 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.h + ..\..\..\..\..\..\pc_firm\parser.h parser.h 0 0 1 - 30 + 15 1 0 0 0 - ..\..\..\..\..\..\..\pc_firm\parser.c + ..\..\..\..\..\..\pc_firm\parser.c parser.c 0 0 1 - 31 + 16 1 0 0 0 - ..\..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.c + ..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.c ble_quick_security.c 0 0 1 - 32 + 17 5 0 0 0 - ..\..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.h + ..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.h ble_quick_security.h 0 0 1 - 33 + 18 1 - 1 + 0 0 0 ..\..\..\..\dr_piezo\dr_piezo.c @@ -1518,7 +1338,7 @@ 1 - 34 + 19 5 0 0 @@ -1530,40 +1350,64 @@ 1 - 35 + 20 1 0 0 0 - ..\..\..\..\..\..\..\pc_firm\dr_util\dr_util.c + ..\..\..\..\..\..\pc_firm\dr_util\dr_util.c dr_util.c 0 0 1 - 36 + 21 5 0 0 0 - ..\..\..\..\..\..\..\pc_firm\dr_util\dr_util.h + ..\..\..\..\..\..\pc_firm\dr_util\dr_util.h dr_util.h 0 0 1 - 37 + 22 1 0 0 0 - ..\..\..\..\..\..\..\pc_firm\dr_adc121s051\dr_adc121s051.c + ..\..\..\..\..\..\pc_firm\dr_adc121s051\dr_adc121s051.c dr_adc121s051.c 0 0 + + 1 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\..\..\pc_firm\dr_w25q32\dr_w25q32.c + dr_w25q32.c + 0 + 0 + + + 1 + 24 + 5 + 0 + 0 + 0 + ..\..\..\..\..\..\pc_firm\dr_w25q32\dr_w25q32.h + dr_w25q32.h + 0 + 0 + @@ -1574,7 +1418,7 @@ 0 2 - 38 + 25 1 0 0 @@ -1594,7 +1438,7 @@ 0 3 - 39 + 26 1 0 0 @@ -1606,7 +1450,7 @@ 3 - 40 + 27 1 0 0 @@ -1626,9 +1470,9 @@ 0 4 - 41 + 28 1 - 1 + 0 0 0 ..\..\..\..\..\..\external\utf_converter\utf.c @@ -1646,7 +1490,7 @@ 0 5 - 42 + 29 1 0 0 @@ -1658,7 +1502,7 @@ 5 - 43 + 30 1 0 0 @@ -1670,7 +1514,7 @@ 5 - 44 + 31 1 0 0 @@ -1682,7 +1526,7 @@ 5 - 45 + 32 1 0 0 @@ -1694,7 +1538,7 @@ 5 - 46 + 33 1 0 0 @@ -1706,7 +1550,7 @@ 5 - 47 + 34 1 0 0 @@ -1718,7 +1562,7 @@ 5 - 48 + 35 1 0 0 @@ -1730,7 +1574,7 @@ 5 - 49 + 36 1 0 0 @@ -1742,7 +1586,7 @@ 5 - 50 + 37 1 0 0 @@ -1754,7 +1598,7 @@ 5 - 51 + 38 1 0 0 @@ -1766,7 +1610,7 @@ 5 - 52 + 39 1 0 0 @@ -1778,7 +1622,7 @@ 5 - 53 + 40 1 0 0 @@ -1790,7 +1634,7 @@ 5 - 54 + 41 1 0 0 @@ -1802,7 +1646,7 @@ 5 - 55 + 42 1 0 0 @@ -1814,7 +1658,7 @@ 5 - 56 + 43 1 0 0 @@ -1826,7 +1670,7 @@ 5 - 57 + 44 1 0 0 @@ -1838,7 +1682,7 @@ 5 - 58 + 45 1 0 0 @@ -1850,7 +1694,7 @@ 5 - 59 + 46 1 0 0 @@ -1862,7 +1706,7 @@ 5 - 60 + 47 1 0 0 @@ -1874,7 +1718,7 @@ 5 - 61 + 48 1 0 0 @@ -1894,9 +1738,9 @@ 0 6 - 62 + 49 1 - 1 + 0 0 0 ..\..\..\..\..\..\components\ble\ble_services\ble_nus\ble_nus.c @@ -1914,7 +1758,7 @@ 0 7 - 63 + 50 1 0 0 @@ -1926,7 +1770,7 @@ 7 - 64 + 51 1 0 0 @@ -1938,7 +1782,7 @@ 7 - 65 + 52 1 0 0 @@ -1950,7 +1794,7 @@ 7 - 66 + 53 1 0 0 @@ -1962,7 +1806,7 @@ 7 - 67 + 54 1 0 0 @@ -1974,7 +1818,7 @@ 7 - 68 + 55 1 0 0 @@ -1986,7 +1830,7 @@ 7 - 69 + 56 1 0 0 @@ -1998,7 +1842,7 @@ 7 - 70 + 57 1 0 0 @@ -2010,7 +1854,7 @@ 7 - 71 + 58 1 0 0 @@ -2022,7 +1866,7 @@ 7 - 72 + 59 1 0 0 @@ -2034,7 +1878,7 @@ 7 - 73 + 60 1 0 0 @@ -2046,7 +1890,7 @@ 7 - 74 + 61 1 0 0 @@ -2058,7 +1902,7 @@ 7 - 75 + 62 1 0 0 @@ -2070,7 +1914,7 @@ 7 - 76 + 63 1 0 0 @@ -2082,7 +1926,7 @@ 7 - 77 + 64 1 0 0 @@ -2094,7 +1938,7 @@ 7 - 78 + 65 1 0 0 @@ -2106,7 +1950,7 @@ 7 - 79 + 66 1 0 0 @@ -2118,7 +1962,7 @@ 7 - 80 + 67 1 0 0 @@ -2130,7 +1974,7 @@ 7 - 81 + 68 1 0 0 @@ -2142,7 +1986,7 @@ 7 - 82 + 69 5 0 0 @@ -2162,7 +2006,7 @@ 0 8 - 83 + 70 1 0 0 @@ -2174,7 +2018,7 @@ 8 - 84 + 71 1 0 0 @@ -2186,7 +2030,7 @@ 8 - 85 + 72 1 0 0 @@ -2198,7 +2042,7 @@ 8 - 86 + 73 1 0 0 @@ -2210,7 +2054,7 @@ 8 - 87 + 74 1 0 0 @@ -2222,7 +2066,7 @@ 8 - 88 + 75 1 0 0 @@ -2234,7 +2078,7 @@ 8 - 89 + 76 1 0 0 @@ -2246,7 +2090,7 @@ 8 - 90 + 77 1 0 0 @@ -2258,7 +2102,7 @@ 8 - 91 + 78 1 0 0 @@ -2270,7 +2114,7 @@ 8 - 92 + 79 1 0 0 @@ -2282,7 +2126,7 @@ 8 - 93 + 80 1 0 0 @@ -2294,7 +2138,7 @@ 8 - 94 + 81 1 0 0 @@ -2306,7 +2150,7 @@ 8 - 95 + 82 1 0 0 @@ -2318,7 +2162,7 @@ 8 - 96 + 83 1 0 0 @@ -2330,7 +2174,7 @@ 8 - 97 + 84 1 0 0 @@ -2342,7 +2186,7 @@ 8 - 98 + 85 1 0 0 @@ -2354,7 +2198,7 @@ 8 - 99 + 86 1 0 0 @@ -2366,7 +2210,7 @@ 8 - 100 + 87 1 0 0 @@ -2378,7 +2222,7 @@ 8 - 101 + 88 1 0 0 @@ -2390,7 +2234,7 @@ 8 - 102 + 89 1 0 0 @@ -2402,7 +2246,7 @@ 8 - 103 + 90 1 0 0 @@ -2414,7 +2258,7 @@ 8 - 104 + 91 1 0 0 @@ -2426,7 +2270,7 @@ 8 - 105 + 92 1 0 0 @@ -2438,7 +2282,7 @@ 8 - 106 + 93 1 0 0 @@ -2450,7 +2294,7 @@ 8 - 107 + 94 1 0 0 @@ -2462,7 +2306,7 @@ 8 - 108 + 95 1 0 0 @@ -2474,7 +2318,7 @@ 8 - 109 + 96 1 0 0 @@ -2486,7 +2330,7 @@ 8 - 110 + 97 1 0 0 @@ -2498,7 +2342,7 @@ 8 - 111 + 98 1 0 0 @@ -2518,7 +2362,7 @@ 0 9 - 112 + 99 1 0 0 @@ -2530,7 +2374,7 @@ 9 - 113 + 100 1 0 0 @@ -2542,7 +2386,7 @@ 9 - 114 + 101 1 0 0 @@ -2554,7 +2398,7 @@ 9 - 115 + 102 1 0 0 @@ -2566,7 +2410,7 @@ 9 - 116 + 103 1 0 0 @@ -2586,7 +2430,7 @@ 0 10 - 117 + 104 1 0 0 @@ -2598,7 +2442,7 @@ 10 - 118 + 105 1 0 0 @@ -2610,7 +2454,7 @@ 10 - 119 + 106 1 0 0 @@ -2630,7 +2474,7 @@ 0 11 - 120 + 107 1 0 0 @@ -2642,7 +2486,7 @@ 11 - 121 + 108 1 0 0 @@ -2654,7 +2498,7 @@ 11 - 122 + 109 1 0 0 @@ -2674,7 +2518,7 @@ 0 12 - 123 + 110 1 0 0 @@ -2686,7 +2530,7 @@ 12 - 124 + 111 1 0 0 @@ -2698,7 +2542,7 @@ 12 - 125 + 112 1 0 0 @@ -2710,7 +2554,7 @@ 12 - 126 + 113 1 0 0 @@ -2730,7 +2574,7 @@ 0 13 - 127 + 114 1 0 0 @@ -2742,7 +2586,7 @@ 13 - 128 + 115 1 0 0 @@ -2754,7 +2598,7 @@ 13 - 129 + 116 1 0 0 @@ -2766,7 +2610,7 @@ 13 - 130 + 117 1 0 0 @@ -2778,7 +2622,7 @@ 13 - 131 + 118 1 0 0 @@ -2790,7 +2634,7 @@ 13 - 132 + 119 1 0 0 @@ -2802,7 +2646,7 @@ 13 - 133 + 120 1 0 0 @@ -2814,7 +2658,7 @@ 13 - 134 + 121 1 0 0 @@ -2826,7 +2670,7 @@ 13 - 135 + 122 1 0 0 @@ -2838,7 +2682,7 @@ 13 - 136 + 123 1 0 0 @@ -2850,7 +2694,7 @@ 13 - 137 + 124 1 0 0 @@ -2862,7 +2706,7 @@ 13 - 138 + 125 1 0 0 @@ -2874,7 +2718,7 @@ 13 - 139 + 126 1 0 0 @@ -2886,7 +2730,7 @@ 13 - 140 + 127 1 0 0 @@ -2906,7 +2750,7 @@ 0 14 - 141 + 128 1 0 0 @@ -2918,7 +2762,7 @@ 14 - 142 + 129 1 0 0 @@ -2930,7 +2774,7 @@ 14 - 143 + 130 1 0 0 @@ -2942,7 +2786,7 @@ 14 - 144 + 131 1 0 0 @@ -2954,7 +2798,7 @@ 14 - 145 + 132 1 0 0 @@ -2966,7 +2810,7 @@ 14 - 146 + 133 1 0 0 @@ -2978,7 +2822,7 @@ 14 - 147 + 134 1 0 0 @@ -2990,7 +2834,7 @@ 14 - 148 + 135 1 0 0 @@ -3002,7 +2846,7 @@ 14 - 149 + 136 1 0 0 @@ -3014,7 +2858,7 @@ 14 - 150 + 137 1 0 0 @@ -3026,7 +2870,7 @@ 14 - 151 + 138 1 0 0 @@ -3038,7 +2882,7 @@ 14 - 152 + 139 1 0 0 @@ -3050,7 +2894,7 @@ 14 - 153 + 140 1 0 0 @@ -3070,7 +2914,7 @@ 0 15 - 154 + 141 1 0 0 @@ -3082,7 +2926,7 @@ 15 - 155 + 142 1 0 0 @@ -3094,7 +2938,7 @@ 15 - 156 + 143 1 0 0 @@ -3106,7 +2950,7 @@ 15 - 157 + 144 1 0 0 @@ -3118,7 +2962,7 @@ 15 - 158 + 145 1 0 0 @@ -3130,7 +2974,7 @@ 15 - 159 + 146 1 0 0 @@ -3142,7 +2986,7 @@ 15 - 160 + 147 1 0 0 @@ -3162,7 +3006,7 @@ 0 16 - 161 + 148 1 0 0 @@ -3174,7 +3018,7 @@ 16 - 162 + 149 1 0 0 @@ -3186,7 +3030,7 @@ 16 - 163 + 150 1 0 0 @@ -3206,7 +3050,7 @@ 0 17 - 164 + 151 4 0 0 @@ -3226,7 +3070,7 @@ 0 18 - 165 + 152 1 0 0 @@ -3238,7 +3082,7 @@ 18 - 166 + 153 1 0 0 @@ -3250,7 +3094,7 @@ 18 - 167 + 154 1 0 0 @@ -3270,7 +3114,7 @@ 0 19 - 168 + 155 4 0 0 @@ -3284,13 +3128,13 @@ ICM42670 - 0 + 1 0 0 0 20 - 169 + 156 1 0 0 @@ -3302,7 +3146,7 @@ 20 - 170 + 157 1 0 0 @@ -3314,7 +3158,7 @@ 20 - 171 + 158 1 0 0 @@ -3326,7 +3170,7 @@ 20 - 172 + 159 1 0 0 @@ -3338,7 +3182,7 @@ 20 - 173 + 160 1 0 0 @@ -3350,7 +3194,7 @@ 20 - 174 + 161 1 0 0 @@ -3362,7 +3206,7 @@ 20 - 175 + 162 1 0 0 @@ -3374,7 +3218,7 @@ 20 - 176 + 163 1 0 0 @@ -3386,7 +3230,7 @@ 20 - 177 + 164 1 0 0 @@ -3398,7 +3242,7 @@ 20 - 178 + 165 1 0 0 diff --git a/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/arm5_no_packs/ble_app_bladder_patch_s140.uvprojx b/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/arm5_no_packs/ble_app_bladder_patch_s140.uvprojx index 98d120b..9fdfb58 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/arm5_no_packs/ble_app_bladder_patch_s140.uvprojx +++ b/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/arm5_no_packs/ble_app_bladder_patch_s140.uvprojx @@ -339,7 +339,7 @@ --reduce_paths --diag_suppress 188 APP_TIMER_V2 APP_TIMER_V2_RTC1_ENABLED BOARD_PCA10056 FLOAT_ABI_HARD NRF52840_XXAA NRF_SD_BLE_API_VERSION=7 S140 SOFTDEVICE_PRESENT __HEAP_SIZE=8192 __STACK_SIZE=8192 NRF_DFU_SVCI_ENABLED NRF_DFU_TRANSPORT_BLE=1 DEBUG ICM42670P CONFIG_NFCT_PINS_AS_GPIOS MBEDTLS_CONFIG_FILE=<nrf_crypto_mbedtls_config.h> NRF_APP_VERSION=0x00000001 NRF_APP_VERSION_ADDR=0x1D000 NRF_CRYPTO_MAX_INSTANCE_COUNT=1 - ..\..\..\config;..\..\..\..\..\..\components;..\..\..\..\..\..\components\ble\ble_advertising;..\..\..\..\..\..\components\ble\ble_dtm;..\..\..\..\..\..\components\ble\ble_link_ctx_manager;..\..\..\..\..\..\components\ble\ble_racp;..\..\..\..\..\..\components\ble\ble_services\ble_ancs_c;..\..\..\..\..\..\components\ble\ble_services\ble_ans_c;..\..\..\..\..\..\components\ble\ble_services\ble_bas;..\..\..\..\..\..\components\ble\ble_services\ble_bas_c;..\..\..\..\..\..\components\ble\ble_services\ble_cscs;..\..\..\..\..\..\components\ble\ble_services\ble_cts_c;..\..\..\..\..\..\components\ble\ble_services\ble_dfu;..\..\..\..\..\..\components\ble\ble_services\ble_dis;..\..\..\..\..\..\components\ble\ble_services\ble_gls;..\..\..\..\..\..\components\ble\ble_services\ble_hids;..\..\..\..\..\..\components\ble\ble_services\ble_hrs;..\..\..\..\..\..\components\ble\ble_services\ble_hrs_c;..\..\..\..\..\..\components\ble\ble_services\ble_hts;..\..\..\..\..\..\components\ble\ble_services\ble_ias;..\..\..\..\..\..\components\ble\ble_services\ble_ias_c;..\..\..\..\..\..\components\ble\ble_services\ble_lbs;..\..\..\..\..\..\components\ble\ble_services\ble_lbs_c;..\..\..\..\..\..\components\ble\ble_services\ble_lls;..\..\..\..\..\..\components\ble\ble_services\ble_nus;..\..\..\..\..\..\components\ble\ble_services\ble_nus_c;..\..\..\..\..\..\components\ble\ble_services\ble_rscs;..\..\..\..\..\..\components\ble\ble_services\ble_rscs_c;..\..\..\..\..\..\components\ble\ble_services\ble_tps;..\..\..\..\..\..\components\ble\common;..\..\..\..\..\..\components\ble\nrf_ble_gatt;..\..\..\..\..\..\components\ble\nrf_ble_qwr;..\..\..\..\..\..\components\ble\peer_manager;..\..\..\..\..\..\components\boards;..\..\..\..\..\..\components\libraries\atomic;..\..\..\..\..\..\components\libraries\atomic_fifo;..\..\..\..\..\..\components\libraries\atomic_flags;..\..\..\..\..\..\components\libraries\balloc;..\..\..\..\..\..\components\libraries\bootloader\ble_dfu;..\..\..\..\..\..\components\libraries\bsp;..\..\..\..\..\..\components\libraries\button;..\..\..\..\..\..\components\libraries\cli;..\..\..\..\..\..\components\libraries\crc16;..\..\..\..\..\..\components\libraries\crc32;..\..\..\..\..\..\components\libraries\crypto;..\..\..\..\..\..\components\libraries\csense;..\..\..\..\..\..\components\libraries\csense_drv;..\..\..\..\..\..\components\libraries\delay;..\..\..\..\..\..\components\libraries\ecc;..\..\..\..\..\..\components\libraries\experimental_section_vars;..\..\..\..\..\..\components\libraries\experimental_task_manager;..\..\..\..\..\..\components\libraries\fds;..\..\..\..\..\..\components\libraries\fifo;..\..\..\..\..\..\components\libraries\fstorage;..\..\..\..\..\..\components\libraries\gfx;..\..\..\..\..\..\components\libraries\gpiote;..\..\..\..\..\..\components\libraries\hardfault;..\..\..\..\..\..\components\libraries\hci;..\..\..\..\..\..\components\libraries\led_softblink;..\..\..\..\..\..\components\libraries\log;..\..\..\..\..\..\components\libraries\log\src;..\..\..\..\..\..\components\libraries\low_power_pwm;..\..\..\..\..\..\components\libraries\mem_manager;..\..\..\..\..\..\components\libraries\memobj;..\..\..\..\..\..\components\libraries\mpu;..\..\..\..\..\..\components\libraries\mutex;..\..\..\..\..\..\components\libraries\pwm;..\..\..\..\..\..\components\libraries\pwr_mgmt;..\..\..\..\..\..\components\libraries\queue;..\..\..\..\..\..\components\libraries\ringbuf;..\..\..\..\..\..\components\libraries\scheduler;..\..\..\..\..\..\components\libraries\sdcard;..\..\..\..\..\..\components\libraries\slip;..\..\..\..\..\..\components\libraries\sortlist;..\..\..\..\..\..\components\libraries\spi_mngr;..\..\..\..\..\..\components\libraries\stack_guard;..\..\..\..\..\..\components\libraries\strerror;..\..\..\..\..\..\components\libraries\svc;..\..\..\..\..\..\components\libraries\timer;..\..\..\..\..\..\components\libraries\twi_mngr;..\..\..\..\..\..\components\libraries\twi_sensor;..\..\..\..\..\..\components\libraries\uart;..\..\..\..\..\..\components\libraries\usbd;..\..\..\..\..\..\components\libraries\usbd\class\audio;..\..\..\..\..\..\components\libraries\usbd\class\cdc;..\..\..\..\..\..\components\libraries\usbd\class\cdc\acm;..\..\..\..\..\..\components\libraries\usbd\class\hid;..\..\..\..\..\..\components\libraries\usbd\class\hid\generic;..\..\..\..\..\..\components\libraries\usbd\class\hid\kbd;..\..\..\..\..\..\components\libraries\usbd\class\hid\mouse;..\..\..\..\..\..\components\libraries\usbd\class\msc;..\..\..\..\..\..\components\libraries\util;..\..\..\..\..\..\components\nfc\ndef\conn_hand_parser;..\..\..\..\..\..\components\nfc\ndef\conn_hand_parser\ac_rec_parser;..\..\..\..\..\..\components\nfc\ndef\conn_hand_parser\ble_oob_advdata_parser;..\..\..\..\..\..\components\nfc\ndef\conn_hand_parser\le_oob_rec_parser;..\..\..\..\..\..\components\nfc\ndef\connection_handover\ac_rec;..\..\..\..\..\..\components\nfc\ndef\connection_handover\ble_oob_advdata;..\..\..\..\..\..\components\nfc\ndef\connection_handover\ble_pair_lib;..\..\..\..\..\..\components\nfc\ndef\connection_handover\ble_pair_msg;..\..\..\..\..\..\components\nfc\ndef\connection_handover\common;..\..\..\..\..\..\components\nfc\ndef\connection_handover\ep_oob_rec;..\..\..\..\..\..\components\nfc\ndef\connection_handover\hs_rec;..\..\..\..\..\..\components\nfc\ndef\connection_handover\le_oob_rec;..\..\..\..\..\..\components\nfc\ndef\generic\message;..\..\..\..\..\..\components\nfc\ndef\generic\record;..\..\..\..\..\..\components\nfc\ndef\launchapp;..\..\..\..\..\..\components\nfc\ndef\parser\message;..\..\..\..\..\..\components\nfc\ndef\parser\record;..\..\..\..\..\..\components\nfc\ndef\text;..\..\..\..\..\..\components\nfc\ndef\uri;..\..\..\..\..\..\components\nfc\platform;..\..\..\..\..\..\components\nfc\t2t_lib;..\..\..\..\..\..\components\nfc\t2t_parser;..\..\..\..\..\..\components\nfc\t4t_lib;..\..\..\..\..\..\components\nfc\t4t_parser\apdu;..\..\..\..\..\..\components\nfc\t4t_parser\cc_file;..\..\..\..\..\..\components\nfc\t4t_parser\hl_detection_procedure;..\..\..\..\..\..\components\nfc\t4t_parser\tlv;..\..\..\..\..\..\components\softdevice\common;..\..\..\..\..\..\components\softdevice\s140\headers;..\..\..\..\..\..\components\softdevice\s140\headers\nrf52;..\..\..\..\..\..\external\fprintf;..\..\..\..\..\..\external\segger_rtt;..\..\..\..\..\..\external\utf_converter;..\..\..\..\..\..\integration\nrfx;..\..\..\..\..\..\integration\nrfx\legacy;..\..\..\..\..\..\modules\nrfx;..\..\..\..\..\..\modules\nrfx\drivers\include;..\..\..\..\..\..\modules\nrfx\hal;..\config;..\..\..\..\ble_app_bladder_patch;..\..\..\..\..\..\components\libraries\bootloader\dfu;..\..\..\..\..\..\components\libraries\bootloader;..\..\..\..\..\..\modules\nrfx\drivers\src;..\..\..\icm42670p;..\..\..\icm42670p\Invn;..\..\..\icm42670p\Invn\EmbUtils;..\..\..\icm42670p\Invn\imu;..\..\..\icm42670p\Invn\lib_agm;..\..\..\icm42670p\Invn\lib_agm\invn\common;..\..\..\icm42670p\Invn\lib_agm\test_vector;..\..\..\..\..\..\integration\nrfx\legacy;..\..\..\icm42670p\app_raw;..\..\..\..\..\..\components\libraries\crypto\backend\cc310;..\..\..\..\..\..\components\libraries\crypto\backend\cc310_bl;..\..\..\..\..\..\components\libraries\crypto\backend\cifra;..\..\..\..\..\..\components\libraries\crypto\backend\mbedtls;..\..\..\..\..\..\components\libraries\crypto\backend\micro_ecc;..\..\..\..\..\..\components\libraries\crypto\backend\nrf_hw;..\..\..\..\..\..\components\libraries\crypto\backend\nrf_sw;..\..\..\..\..\..\components\libraries\crypto\backend\oberon;..\..\..\..\..\..\components\libraries\crypto\backend\optiga;..\..\..\..\..\..\external\nrf_cc310\include;..\..\..\..\..\..\external\mbedtls\include;..\..\..\..\..\..\external\nrf_oberon;..\..\..\..\..\..\external\nrf_oberon\include;..\..\..\..\..\..\external\nrf_tls\mbedtls\nrf_crypto\config;..\..\..\..\..\..\components\libraries\stack_info;..\..\..\..\..\..\..\pc_firm\ble_security;D:\mt_project\pc_firm;..\..\..\..\dr_piezo;..\..\..\..\..\..\..\pc_firm\dr_util;..\..\..\..\..\..\..\pc_firm\dr_adc121s051 + ..\..\..\config;..\..\..\..\..\..\components;..\..\..\..\..\..\components\ble\ble_advertising;..\..\..\..\..\..\components\ble\ble_dtm;..\..\..\..\..\..\components\ble\ble_link_ctx_manager;..\..\..\..\..\..\components\ble\ble_racp;..\..\..\..\..\..\components\ble\ble_services\ble_ancs_c;..\..\..\..\..\..\components\ble\ble_services\ble_ans_c;..\..\..\..\..\..\components\ble\ble_services\ble_bas;..\..\..\..\..\..\components\ble\ble_services\ble_bas_c;..\..\..\..\..\..\components\ble\ble_services\ble_cscs;..\..\..\..\..\..\components\ble\ble_services\ble_cts_c;..\..\..\..\..\..\components\ble\ble_services\ble_dfu;..\..\..\..\..\..\components\ble\ble_services\ble_dis;..\..\..\..\..\..\components\ble\ble_services\ble_gls;..\..\..\..\..\..\components\ble\ble_services\ble_hids;..\..\..\..\..\..\components\ble\ble_services\ble_hrs;..\..\..\..\..\..\components\ble\ble_services\ble_hrs_c;..\..\..\..\..\..\components\ble\ble_services\ble_hts;..\..\..\..\..\..\components\ble\ble_services\ble_ias;..\..\..\..\..\..\components\ble\ble_services\ble_ias_c;..\..\..\..\..\..\components\ble\ble_services\ble_lbs;..\..\..\..\..\..\components\ble\ble_services\ble_lbs_c;..\..\..\..\..\..\components\ble\ble_services\ble_lls;..\..\..\..\..\..\components\ble\ble_services\ble_nus;..\..\..\..\..\..\components\ble\ble_services\ble_nus_c;..\..\..\..\..\..\components\ble\ble_services\ble_rscs;..\..\..\..\..\..\components\ble\ble_services\ble_rscs_c;..\..\..\..\..\..\components\ble\ble_services\ble_tps;..\..\..\..\..\..\components\ble\common;..\..\..\..\..\..\components\ble\nrf_ble_gatt;..\..\..\..\..\..\components\ble\nrf_ble_qwr;..\..\..\..\..\..\components\ble\peer_manager;..\..\..\..\..\..\components\boards;..\..\..\..\..\..\components\libraries\atomic;..\..\..\..\..\..\components\libraries\atomic_fifo;..\..\..\..\..\..\components\libraries\atomic_flags;..\..\..\..\..\..\components\libraries\balloc;..\..\..\..\..\..\components\libraries\bootloader\ble_dfu;..\..\..\..\..\..\components\libraries\bsp;..\..\..\..\..\..\components\libraries\button;..\..\..\..\..\..\components\libraries\cli;..\..\..\..\..\..\components\libraries\crc16;..\..\..\..\..\..\components\libraries\crc32;..\..\..\..\..\..\components\libraries\crypto;..\..\..\..\..\..\components\libraries\csense;..\..\..\..\..\..\components\libraries\csense_drv;..\..\..\..\..\..\components\libraries\delay;..\..\..\..\..\..\components\libraries\ecc;..\..\..\..\..\..\components\libraries\experimental_section_vars;..\..\..\..\..\..\components\libraries\experimental_task_manager;..\..\..\..\..\..\components\libraries\fds;..\..\..\..\..\..\components\libraries\fifo;..\..\..\..\..\..\components\libraries\fstorage;..\..\..\..\..\..\components\libraries\gfx;..\..\..\..\..\..\components\libraries\gpiote;..\..\..\..\..\..\components\libraries\hardfault;..\..\..\..\..\..\components\libraries\hci;..\..\..\..\..\..\components\libraries\led_softblink;..\..\..\..\..\..\components\libraries\log;..\..\..\..\..\..\components\libraries\log\src;..\..\..\..\..\..\components\libraries\low_power_pwm;..\..\..\..\..\..\components\libraries\mem_manager;..\..\..\..\..\..\components\libraries\memobj;..\..\..\..\..\..\components\libraries\mpu;..\..\..\..\..\..\components\libraries\mutex;..\..\..\..\..\..\components\libraries\pwm;..\..\..\..\..\..\components\libraries\pwr_mgmt;..\..\..\..\..\..\components\libraries\queue;..\..\..\..\..\..\components\libraries\ringbuf;..\..\..\..\..\..\components\libraries\scheduler;..\..\..\..\..\..\components\libraries\sdcard;..\..\..\..\..\..\components\libraries\slip;..\..\..\..\..\..\components\libraries\sortlist;..\..\..\..\..\..\components\libraries\spi_mngr;..\..\..\..\..\..\components\libraries\stack_guard;..\..\..\..\..\..\components\libraries\strerror;..\..\..\..\..\..\components\libraries\svc;..\..\..\..\..\..\components\libraries\timer;..\..\..\..\..\..\components\libraries\twi_mngr;..\..\..\..\..\..\components\libraries\twi_sensor;..\..\..\..\..\..\components\libraries\uart;..\..\..\..\..\..\components\libraries\usbd;..\..\..\..\..\..\components\libraries\usbd\class\audio;..\..\..\..\..\..\components\libraries\usbd\class\cdc;..\..\..\..\..\..\components\libraries\usbd\class\cdc\acm;..\..\..\..\..\..\components\libraries\usbd\class\hid;..\..\..\..\..\..\components\libraries\usbd\class\hid\generic;..\..\..\..\..\..\components\libraries\usbd\class\hid\kbd;..\..\..\..\..\..\components\libraries\usbd\class\hid\mouse;..\..\..\..\..\..\components\libraries\usbd\class\msc;..\..\..\..\..\..\components\libraries\util;..\..\..\..\..\..\components\nfc\ndef\conn_hand_parser;..\..\..\..\..\..\components\nfc\ndef\conn_hand_parser\ac_rec_parser;..\..\..\..\..\..\components\nfc\ndef\conn_hand_parser\ble_oob_advdata_parser;..\..\..\..\..\..\components\nfc\ndef\conn_hand_parser\le_oob_rec_parser;..\..\..\..\..\..\components\nfc\ndef\connection_handover\ac_rec;..\..\..\..\..\..\components\nfc\ndef\connection_handover\ble_oob_advdata;..\..\..\..\..\..\components\nfc\ndef\connection_handover\ble_pair_lib;..\..\..\..\..\..\components\nfc\ndef\connection_handover\ble_pair_msg;..\..\..\..\..\..\components\nfc\ndef\connection_handover\common;..\..\..\..\..\..\components\nfc\ndef\connection_handover\ep_oob_rec;..\..\..\..\..\..\components\nfc\ndef\connection_handover\hs_rec;..\..\..\..\..\..\components\nfc\ndef\connection_handover\le_oob_rec;..\..\..\..\..\..\components\nfc\ndef\generic\message;..\..\..\..\..\..\components\nfc\ndef\generic\record;..\..\..\..\..\..\components\nfc\ndef\launchapp;..\..\..\..\..\..\components\nfc\ndef\parser\message;..\..\..\..\..\..\components\nfc\ndef\parser\record;..\..\..\..\..\..\components\nfc\ndef\text;..\..\..\..\..\..\components\nfc\ndef\uri;..\..\..\..\..\..\components\nfc\platform;..\..\..\..\..\..\components\nfc\t2t_lib;..\..\..\..\..\..\components\nfc\t2t_parser;..\..\..\..\..\..\components\nfc\t4t_lib;..\..\..\..\..\..\components\nfc\t4t_parser\apdu;..\..\..\..\..\..\components\nfc\t4t_parser\cc_file;..\..\..\..\..\..\components\nfc\t4t_parser\hl_detection_procedure;..\..\..\..\..\..\components\nfc\t4t_parser\tlv;..\..\..\..\..\..\components\softdevice\common;..\..\..\..\..\..\components\softdevice\s140\headers;..\..\..\..\..\..\components\softdevice\s140\headers\nrf52;..\..\..\..\..\..\external\fprintf;..\..\..\..\..\..\external\segger_rtt;..\..\..\..\..\..\external\utf_converter;..\..\..\..\..\..\integration\nrfx;..\..\..\..\..\..\integration\nrfx\legacy;..\..\..\..\..\..\modules\nrfx;..\..\..\..\..\..\modules\nrfx\drivers\include;..\..\..\..\..\..\modules\nrfx\hal;..\config;..\..\..\..\ble_app_bladder_patch;..\..\..\..\..\..\components\libraries\bootloader\dfu;..\..\..\..\..\..\components\libraries\bootloader;..\..\..\..\..\..\modules\nrfx\drivers\src;..\..\..\icm42670p;..\..\..\icm42670p\Invn;..\..\..\icm42670p\Invn\EmbUtils;..\..\..\icm42670p\Invn\imu;..\..\..\icm42670p\Invn\lib_agm;..\..\..\icm42670p\Invn\lib_agm\invn\common;..\..\..\icm42670p\Invn\lib_agm\test_vector;..\..\..\..\..\..\integration\nrfx\legacy;..\..\..\icm42670p\app_raw;..\..\..\..\..\..\components\libraries\crypto\backend\cc310;..\..\..\..\..\..\components\libraries\crypto\backend\cc310_bl;..\..\..\..\..\..\components\libraries\crypto\backend\cifra;..\..\..\..\..\..\components\libraries\crypto\backend\mbedtls;..\..\..\..\..\..\components\libraries\crypto\backend\micro_ecc;..\..\..\..\..\..\components\libraries\crypto\backend\nrf_hw;..\..\..\..\..\..\components\libraries\crypto\backend\nrf_sw;..\..\..\..\..\..\components\libraries\crypto\backend\oberon;..\..\..\..\..\..\components\libraries\crypto\backend\optiga;..\..\..\..\..\..\external\nrf_cc310\include;..\..\..\..\..\..\external\mbedtls\include;..\..\..\..\..\..\external\nrf_oberon;..\..\..\..\..\..\external\nrf_oberon\include;..\..\..\..\..\..\external\nrf_tls\mbedtls\nrf_crypto\config;..\..\..\..\..\..\components\libraries\stack_info;..\..\..\..\..\..\pc_firm\ble_security;..\..\..\..\..\..\pc_firm;..\..\..\..\dr_piezo;..\..\..\..\..\..\pc_firm\dr_util;..\..\..\..\..\..\pc_firm\dr_adc121s051;..\..\..\..\..\..\pc_firm\dr_w25q32 @@ -398,26 +398,11 @@ 1 ..\..\..\main_timer.c - - ada2200_spi.c - 1 - ..\..\..\ada2200_spi.c - - - ad5272_i2c.c - 1 - ..\..\..\ad5272_i2c.c - battery_saadc.c 1 ..\..\..\battery_saadc.c - - mcp4725_i2c.c - 1 - ..\..\..\mcp4725_i2c.c - power_control.c 1 @@ -428,51 +413,11 @@ 1 ..\..\..\tmp235_q1.c - - measurements.c - 1 - ..\..\..\measurements.c - fstorage.c 1 ..\..\..\fstorage.c - - mcp4725_adc.c - 1 - ..\..\..\mcp4725_adc.c - - - meas_pd_voltage_simple.c - 1 - ..\..\..\meas_pd_voltage_simple.c - - - full_agc.c - 1 - ..\..\..\full_agc.c - - - ir_i2c.c - 1 - ..\..\..\ir_i2c.c - - - LED_Parse.c - 1 - ..\..\..\LED_Parse.c - - - cat_interface.c - 1 - ..\..\..\cat_interface.c - - - cat_interface.h - 5 - ..\..\..\cat_interface.h - cmd_parse.c 1 @@ -483,26 +428,6 @@ 5 ..\..\..\cmd_parse.h - - meas_pd_imm.h - 5 - ..\..\..\meas_pd_imm.h - - - meas_pd_imm.c - 1 - ..\..\..\meas_pd_imm.c - - - meas_pd_48.c - 1 - ..\..\..\meas_pd_48.c - - - meas_pd_48.h - 5 - ..\..\..\meas_pd_48.h - debug_print.h 5 @@ -526,22 +451,22 @@ parser.h 5 - ..\..\..\..\..\..\..\pc_firm\parser.h + ..\..\..\..\..\..\pc_firm\parser.h parser.c 1 - ..\..\..\..\..\..\..\pc_firm\parser.c + ..\..\..\..\..\..\pc_firm\parser.c ble_quick_security.c 1 - ..\..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.c + ..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.c ble_quick_security.h 5 - ..\..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.h + ..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.h dr_piezo.c @@ -556,17 +481,27 @@ dr_util.c 1 - ..\..\..\..\..\..\..\pc_firm\dr_util\dr_util.c + ..\..\..\..\..\..\pc_firm\dr_util\dr_util.c dr_util.h 5 - ..\..\..\..\..\..\..\pc_firm\dr_util\dr_util.h + ..\..\..\..\..\..\pc_firm\dr_util\dr_util.h dr_adc121s051.c 1 - ..\..\..\..\..\..\..\pc_firm\dr_adc121s051\dr_adc121s051.c + ..\..\..\..\..\..\pc_firm\dr_adc121s051\dr_adc121s051.c + + + dr_w25q32.c + 1 + ..\..\..\..\..\..\pc_firm\dr_w25q32\dr_w25q32.c + + + dr_w25q32.h + 5 + ..\..\..\..\..\..\pc_firm\dr_w25q32\dr_w25q32.h @@ -4676,26 +4611,11 @@ 1 ..\..\..\main_timer.c - - ada2200_spi.c - 1 - ..\..\..\ada2200_spi.c - - - ad5272_i2c.c - 1 - ..\..\..\ad5272_i2c.c - battery_saadc.c 1 ..\..\..\battery_saadc.c - - mcp4725_i2c.c - 1 - ..\..\..\mcp4725_i2c.c - power_control.c 1 @@ -4706,51 +4626,11 @@ 1 ..\..\..\tmp235_q1.c - - measurements.c - 1 - ..\..\..\measurements.c - fstorage.c 1 ..\..\..\fstorage.c - - mcp4725_adc.c - 1 - ..\..\..\mcp4725_adc.c - - - meas_pd_voltage_simple.c - 1 - ..\..\..\meas_pd_voltage_simple.c - - - full_agc.c - 1 - ..\..\..\full_agc.c - - - ir_i2c.c - 1 - ..\..\..\ir_i2c.c - - - LED_Parse.c - 1 - ..\..\..\LED_Parse.c - - - cat_interface.c - 1 - ..\..\..\cat_interface.c - - - cat_interface.h - 5 - ..\..\..\cat_interface.h - cmd_parse.c 1 @@ -4761,26 +4641,6 @@ 5 ..\..\..\cmd_parse.h - - meas_pd_imm.h - 5 - ..\..\..\meas_pd_imm.h - - - meas_pd_imm.c - 1 - ..\..\..\meas_pd_imm.c - - - meas_pd_48.c - 1 - ..\..\..\meas_pd_48.c - - - meas_pd_48.h - 5 - ..\..\..\meas_pd_48.h - debug_print.h 5 @@ -4804,22 +4664,22 @@ parser.h 5 - ..\..\..\..\..\..\..\pc_firm\parser.h + ..\..\..\..\..\..\pc_firm\parser.h parser.c 1 - ..\..\..\..\..\..\..\pc_firm\parser.c + ..\..\..\..\..\..\pc_firm\parser.c ble_quick_security.c 1 - ..\..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.c + ..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.c ble_quick_security.h 5 - ..\..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.h + ..\..\..\..\..\..\pc_firm\ble_security\ble_quick_security.h dr_piezo.c @@ -4834,17 +4694,27 @@ dr_util.c 1 - ..\..\..\..\..\..\..\pc_firm\dr_util\dr_util.c + ..\..\..\..\..\..\pc_firm\dr_util\dr_util.c dr_util.h 5 - ..\..\..\..\..\..\..\pc_firm\dr_util\dr_util.h + ..\..\..\..\..\..\pc_firm\dr_util\dr_util.h dr_adc121s051.c 1 - ..\..\..\..\..\..\..\pc_firm\dr_adc121s051\dr_adc121s051.c + ..\..\..\..\..\..\pc_firm\dr_adc121s051\dr_adc121s051.c + + + dr_w25q32.c + 1 + ..\..\..\..\..\..\pc_firm\dr_w25q32\dr_w25q32.c + + + dr_w25q32.h + 5 + ..\..\..\..\..\..\pc_firm\dr_w25q32\dr_w25q32.h diff --git a/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/i2c_manager.c b/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/i2c_manager.c index 5a28e6d..905e6c1 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/i2c_manager.c +++ b/project/ble_peripheral/ble_app_bladder_patch/pca10056/s140/i2c_manager.c @@ -6,14 +6,41 @@ #include "i2c_manager.h" #include "debug_print.h" #include "nrf_delay.h" -#include "eeprom_driver.h" -#include "mcp4725_i2c.h" #include "nrf_drv_twi.h" -#include "cat_interface.h" +#include "nrfx_twi.h" +#include "boards.h" +#include "system_interface.h" + bool HW_I2C_FRQ = false; bool SW_I2C_FRQ = false; -extern const nrf_drv_twi_t m_eeprom; +#define TWI_INSTANCE 0 + +/* TWI (I2C) 하드웨어 인스턴스 : IMU 드라이버에서 사용 - jhChun 26.03.16 */ +const nrfx_twi_t m_twi = NRFX_TWI_INSTANCE(TWI_INSTANCE); + +/* TWI (I2C) 해제 - jhChun 26.03.16 */ +static void twi_uninitialize(void){ + nrfx_twi_disable(&m_twi); + nrfx_twi_uninit(&m_twi); +} + +/* TWI (I2C) 하드웨어 초기화 (SCL/SDA핀, 400kHz) - jhChun 26.03.16 */ +static void twi_initialize(void){ + ret_code_t err_code; + + const nrfx_twi_config_t twi_config = { + .scl = ICM42670_I2C_SCL_PIN, + .sda = ICM42670_I2C_SDA_PIN, + .frequency = NRF_TWI_FREQ_400K, + .interrupt_priority = APP_IRQ_PRIORITY_HIGH, + }; + + err_code = nrfx_twi_init(&m_twi, &twi_config, NULL, NULL); + APP_ERROR_CHECK(err_code); + + nrfx_twi_enable(&m_twi); +} /* -------------------------------------------------------------------------- */ /* HW (TWI) 초기화 */ @@ -34,7 +61,7 @@ void hw_i2c_init_once(void) } DBG_PRINTF("[I2C] Initializing HW (TWI) I2C...\r\n"); - eeprom_initialize(); + twi_initialize(); nrf_delay_ms(2); HW_I2C_FRQ = true; @@ -53,8 +80,8 @@ void sw_i2c_init_once(void) DBG_PRINTF("[I2C] HW I2C active -> switching to SW I2C\r\n"); // HW 완전 종료 - nrf_drv_twi_disable(&m_eeprom); - nrf_drv_twi_uninit(&m_eeprom); + nrfx_twi_disable(&m_twi); + nrfx_twi_uninit(&m_twi); nrf_delay_ms(3); HW_I2C_FRQ = false; // 반드시 false로 갱신 @@ -65,9 +92,8 @@ void sw_i2c_init_once(void) { DBG_PRINTF("[I2C] Initializing SW (Port Bang-Bang) I2C...\r\n"); - eeprom_uninitialize(); // SDA/SCL 해제 + twi_uninitialize(); // SDA/SCL 해제 nrf_delay_ms(1); - mcp4725_init(); // 소프트 I2C 초기화 SW_I2C_FRQ = true; HW_I2C_FRQ = false; diff --git a/project/ble_peripheral/ble_app_bladder_patch/power_control.c b/project/ble_peripheral/ble_app_bladder_patch/power_control.c index 716564f..ec040aa 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/power_control.c +++ b/project/ble_peripheral/ble_app_bladder_patch/power_control.c @@ -14,7 +14,6 @@ #include "nrf_log.h" #include "app_timer.h" #include "debug_print.h" -#include "cat_interface.h" #include "i2c_manager.h" #define EEP_WP NRF_GPIO_PIN_MAP(0, 24) APP_TIMER_DEF(m_power_timer_id); diff --git a/project/ble_peripheral/ble_app_bladder_patch/tmp235_q1.c b/project/ble_peripheral/ble_app_bladder_patch/tmp235_q1.c index ef00b3f..c715d11 100644 --- a/project/ble_peripheral/ble_app_bladder_patch/tmp235_q1.c +++ b/project/ble_peripheral/ble_app_bladder_patch/tmp235_q1.c @@ -19,7 +19,6 @@ #include "ble_nus.h" #include "tmp235_q1.h" #include "main.h" -#include "meas_pd_48.h" #include #include "main_timer.h" #include "debug_print.h" @@ -42,7 +41,7 @@ extern uint8_t ble_bin_buffer[BLE_NUS_MAX_DATA_LEN] ; extern which_cmd_t cmd_type_t; extern bool info4; //cmd_parse extern bool go_temp; //cmd_parse -extern volatile uint16_t info_temp; //48_C +volatile uint16_t info_temp; //48_C extern bool motion_raw_data_enabled; /**@brief Function for handling the ADC interrupt. @@ -87,7 +86,7 @@ void tmp235_voltage_handler(nrf_drv_saadc_evt_t const * p_event) /* TMP325 Vout led_temp_16 = (uint16_t)(led_temp*100); single_format_data(ble_bin_buffer, "rso:", led_temp_16); - binary_tx_handler(ble_bin_buffer,3); + dr_binary_tx_safe(ble_bin_buffer,3); // sprintf(ble_tx_buffer, "To%.2f\r\n",led_temp); // data_tx_handler(ble_tx_buffer); diff --git a/project/ble_peripheral/dr_piezo/dr_piezo.h b/project/ble_peripheral/dr_piezo/dr_piezo.h index aa7818d..f87a57b 100644 --- a/project/ble_peripheral/dr_piezo/dr_piezo.h +++ b/project/ble_peripheral/dr_piezo/dr_piezo.h @@ -69,7 +69,7 @@ #define DR_PIEZO_FREQ_HZ 2100000 /**< Target frequency (set PIEZO_FREQ_MHZ in .c) */ #define DR_PIEZO_DEFAULT_CYCLES 5 /**< Default burst cycles (3~5) */ #define DR_PIEZO_MIN_CYCLES 3 -#define DR_PIEZO_MAX_CYCLES 10 +#define DR_PIEZO_MAX_CYCLES 7 /* 3 -> 7 jhChun 26.03.12 */ #define DR_PIEZO_MUX_SETTLING_US 1300 /**< MUX settling delay (us) */ /*==============================================================================